nm *.so no symbol

本文详细介绍了Linux环境下.so文件与Windows系统中的dll文件的区别,包括它们在elf格式中的符号表组织方式,以及如何通过nm命令查看动态符号表。同时讨论了在.so文件中符号表与源代码函数名之间的不一致问题,并提供了解决策略,如使用特定预处理指令来确保C++函数名在不同环境中的一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

动态链接库文件(windows里的dll)在linux里以.so结尾,称为shared object library 。
该文件是elf(Executable and Linkable Format)文件的一种,有两个符号表,“.symtab”和“.dynsym”。
“.dynsym”只保留“.symtab”中的全局符号(global symbols )。

命令strip可以去掉elf文件中“.symtab”,但不会去掉“.dynsym”。

/lib里的共享对象库.so文件在使用nm时提示no symbol是因为被strip了。所以需要查看动态符号表“.dynsym”,加上-D:
usr@usrpc:~$nm -Do /lib/*.so.* 


g++编译后的so文件中的符号表中的函数名与源文件定义的函数名可能不一样,所以,C++定义的函数,要加上


#ifdef   __cplusplus   
#extern   "C"{   
#endif   
    
//头文件主体   
    
#ifdef   __cplusplus   
}   
#endif   
Execution failed for task ':app_rknn_face_demp:buildCMakeDebug[arm64-v8a]'. > com.android.ide.common.process.ProcessException: ninja: Entering directory `D:\AndroidProject\Application_721_rknn\app_rknn_face_demp\.cxx\Debug\4q243e49\arm64-v8a' [1/1] Linking CXX shared library ..\..\..\..\build\intermediates\cxx\Debug\4q243e49\obj\arm64-v8a\librknn4j.so FAILED: ../../../../build/intermediates/cxx/Debug/4q243e49/obj/arm64-v8a/librknn4j.so cmd.exe /C "cd . && C:\Users\16270\AppData\Local\Android\Sdk\ndk\23.1.7779620\toolchains\llvm\prebuilt\windows-x86_64\bin\clang++.exe --target=aarch64-none-linux-android24 --sysroot=C:/Users/16270/AppData/Local/Android/Sdk/ndk/23.1.7779620/toolchains/llvm/prebuilt/windows-x86_64/sysroot -fPIC -std=c++11 -fexceptions -g -fno-limit-debug-info -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--fatal-warnings -Qunused-arguments -Wl,--no-undefined -shared -Wl,-soname,librknn4j.so -o ..\..\..\..\build\intermediates\cxx\Debug\4q243e49\obj\arm64-v8a\librknn4j.so CMakeFiles/rknn4j.dir/src/main/cpp/native-lib.cc.o -Wl,--no-undefined ../../../../src/main/jniLibs/arm64-v8a/librknnrt.so ../../../../src/main/jniLibs/arm64-v8a/libRKFace.so ../../../../src/main/jniLibs/arm64-v8a/libnva.so ../../../../src/main/jniLibs/arm64-v8a/libc++_shared.so ../../../../src/main/jniLibs/arm64-v8a/libsunchip_rknn.so C:/Users/16270/AppData/Local/Android/Sdk/ndk/23.1.7779620/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/lib/aarch64-linux-android/24/liblog.so -static-libstdc++ -latomic -lm && cd ." ld: error: found local symbol '__bss_start' in global part of symbol table in file ../../../../src/main/jniLibs/arm64-v8a/libsunchip_rknn.so ld: error: found local symbol '_edata' in global part of symbol table in file ../../../../src/main/jniLibs/arm64-v8a/libsunchip_rknn.so ld: error: found local symbol '_end' in global part of symbol table in file ../../../../src/main/jniLibs/arm64-v8a/libsunchip_rknn.so clang++: error: linker command failed with exit code 1 (use -v to see invocation) ninja: build stopped: subcommand failed. 这是什么报错
最新发布
06-14
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值