我需要在另一个没有安装 mudflap 库并且具有不同 glibc 版本的 linux 发行版中运行我的程序。我试图用 -static 编译我的程序,但这是不可能的:
warning: Using 'getaddrinfo' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
因此,我正在尝试 -nostdlib 并手动附加库,但出现以下错误:
myuser@linux:~/Desktop$ gcc -nostdlib -Wl,-dynamic-linker,/home/myuser/Desktop/ld-linux-x86-64.so.2,-rpath,/home/myuser/Desktop /home/myuser/Desktop/libc.so.6 -fmudflap /home/myuser/Desktop/libmudflap.so.0 /home/myuser/Desktop/libdl.so.2 simple.c myuser@linux:~/Desktop$ ./a.out mf: dlsym("mmap") = NULL Aborted (core dumped) myuser@linux:~/Desktop$ ldd a.out linux-vdso.so.1 => (0x00007fff2bad2000) libc.so.6 => /home/myuser/Desktop/libc.so.6 (0x00007fddfd521000) libmudflap.so.0 => /home/myuser/Desktop/libmudflap.so.0 (0x00007fddfd175000) libdl.so.2 => /home/myuser/Desktop/libdl.so.2 (0x00007fddfcf70000) /home/myuser/Desktop/ld-linux-x86-64.so.2 => /lib64/ld-linux-x86-64.so.2 (0x00007fddfd884000) myuser@linux:~/Desktop$
- 真正使用的是哪个 ld?我的桌面中的那个还是/lib64 中的那个?
- 必须包含哪些其他标志才能使其正确编译?
最佳答案
与其尝试静态链接库,不如将它们与您的可执行文件一起携带,并让 LD_LIBRARY_PATH 或 rpath 指向包含它们的目录。
但是永远不要携带 libc,如果你在旧的 libc 版本上链接你的程序你应该是安全的。这意味着您需要在较旧或与目标系统完全相同的环境中编译您的应用程序。
只要您不使用在编译系统和目标系统之间进行版本更新的符号,您就可以使用更新的系统。
不幸的是,静态链接比听起来要复杂得多。
关于c - gcc -nostdlib 和 mudflap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5777067/