通常的做法是从动态库中删除符号表(Windows上为.dll,OSX上为.dylib,Linux/Solaris/BSD上为.so).这是有道理的,因为它大大减少了库的文件大小,通常超过75%.
但是,这个问题一直困扰着我:剥离的库没有符号表.如果我编写一个引用此库中的函数的可执行文件,那么当没有符号表来提供此信息时,操作系统的动态链接器如何知道在剥离库中的代码部分的位置?
此问题包括在编译时链接可执行文件之前删除库的情况以及在编译时链接可执行文件后删除库的情况.
如果有人能向我解释这一点,那就太好了!谢谢.
我正在编写一个示例以使用 c# 代码调用 c++ 共享库中的某些函数。环境为 Ubuntu 16.04 和 .NET Core 2.0。
class Program
{
[DllImport("libc.so.6")]
private static extern int getpid();
[DllImport("/home/xxx/invoke/hi.so")]
private static extern int Sayhi();
static void Main(string[] args)
{
int pid= getpid();
Console.WriteLine(pid);
Console.WriteLine("Hello World!");
int status= Sayhi();
Console.WriteLine(status);
}
}
Run Code Online (Sandbox Code Playgroud)
中央人民政府:
#include <iostream>
using namespace std;
int Sayhi(){
cout<<"hello world from cpp!"<<endl;
return 1;
}
Run Code Online (Sandbox Code Playgroud)
如果我运行 c# 代码,我会收到错误消息:
Unhandled Exception: System.EntryPointNotFoundException: Unable to find an entry point named 'Sayhi' in DLL '/home/xxx/invoke/hi.so'.
at invoke.Program.Sayhi()
at invoke.Program.Main(String[] args) …Run Code Online (Sandbox Code Playgroud) 我在eclipse中使用android ndk.我编译了我的项目,但在运行时遇到了错误.我有libcrytpoNative.so和libsslNative.so文件但我得到这个错误libcrypto.so.1.0.0没有找到错误.我该怎么解决这个问题?
这是输出 ndk-build V=1
Android NDK: WARNING: APP_PLATFORM android-21 is larger than android:minSdkVersion 14 in ./AndroidManifest.xml
rm -f ./libs/arm64-v8a/lib*.so ./libs/armeabi/lib*.so ./libs/armeabi-v7a/lib*.so ./libs/armeabi-v7a-hard/lib*.so ./libs/mips/lib*.so ./libs/mips64/lib*.so ./libs/x86/lib*.so ./libs/x86_64/lib*.so
rm -f ./libs/arm64-v8a/gdbserver ./libs/armeabi/gdbserver ./libs/armeabi-v7a/gdbserver ./libs/armeabi-v7a-hard/gdbserver ./libs/mips/gdbserver ./libs/mips64/gdbserver ./libs/x86/gdbserver ./libs/x86_64/gdbserver
rm -f ./libs/arm64-v8a/gdb.setup ./libs/armeabi/gdb.setup ./libs/armeabi-v7a/gdb.setup ./libs/armeabi-v7a-hard/gdb.setup ./libs/mips/gdb.setup ./libs/mips64/gdb.setup ./libs/x86/gdb.setup ./libs/x86_64/gdb.setup
[armeabi-v7a] Install : libcpabe.so => libs/armeabi-v7a/libcpabe.so
install -p ./obj/local/armeabi-v7a/libcpabe.so ./libs/armeabi-v7a/libcpabe.so
/home/yogi/android-ndk/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-strip --strip-unneeded ./libs/armeabi-v7a/libcpabe.so
[armeabi-v7a] Install : libcryptoNative.so => libs/armeabi-v7a/libcryptoNative.so
install -p ./obj/local/armeabi-v7a/libcryptoNative.so ./libs/armeabi-v7a/libcryptoNative.so
/home/yogi/android-ndk/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-strip --strip-unneeded ./libs/armeabi-v7a/libcryptoNative.so
[armeabi-v7a] …Run Code Online (Sandbox Code Playgroud) 我可以从哪里下载 OS X 的 readelf 和 objdump 二进制文件?我正在尝试从 NDK .so 库中获取导出函数的列表,但 nm 和 otool 都不适合我。我读过该库可能是 elf 格式,并且 readelf 或 objdump 可能会起作用。
我能够找到这些实用程序的源代码,但我想要二进制文件。当然,它们已经被某人编译了。
这篇 SO 文章中有很多信息:如何在 .so 文件中列出符号当 nm 对我不起作用时,推荐使用 readelf 和 objdump。
几个星期以来我一直坚持这个问题并一直在互联网上寻找解决方案,但到目前为止还不太好......
所以我有一个由其他人编写的程序,我尝试在Matlab中编译它以使其工作.我的电脑是Red-hat企业Linux工作站(64位),安装了gcc 4.4.3和Matlab 2011b.gcc与我的Matlab兼容(http://www.mathworks.com/support/compilers/R2011b/glnxa64.html).
编译工作正常(我的意思是,在Matlab命令窗口中没有出现错误信息).但是在编译之后,每当我使用编译中的特定函数(它的调用"mexLasso")时,它都会显示如下错误:
***无效的MEX文件'/usr/local/matlab_R2011b/toolbox/spams-matlab/build/mexLasso.mexa64':/ usr/local/matlab_R2011b/bin/glnxa64/../../sys/os/glnxa64 /libstdc++.so.6:找不到版本`GLIBCXX_3.4.11'(/usr/local/matlab_R2011b/toolbox/spams-matlab/build/mexLasso.mexa64要求)
测试错误(第24行)alpha = mexLasso(X,D,param); *
所以我在终端输入"strings /usr/lib/libstdc++.so.6 | grep GLIBC",我发现其中实际上是"GLIBCXX_3.4.11".
我一直在使用Linux和gcc的东西只有几个月......所以仍然有很多我不理解的东西.如果您能详细解释它将会有很大帮助.谢谢!!
%%更多细节:我从http://spams-devel.gforge.inria.fr/downloads.html获得了机器学习的这些程序.奇怪的是,在编译之后,该包中的其他函数工作正常(例如"mexTrainDL").