c - gcc -nostdlib 和 mudflap

标签 c linux gcc

我需要在另一个没有安装 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$
  1. 真正使用的是哪个 ld?我的桌面中的那个还是/lib64 中的那个?
  2. 必须包含哪些其他标志才能使其正确编译?

最佳答案

与其尝试静态链接库,不如将它们与您的可执行文件一起携带,并让 LD_LIBRARY_PATH 或 rpath 指向包含它们的目录。

但是永远不要携带 libc,如果你在旧的 libc 版本上链接你的程序你应该是安全的。这意味着您需要在较旧或与目标系统完全相同的环境中编译您的应用程序。

只要您不使用在编译系统和目标系统之间进行版本更新的符号,您就可以使用更新的系统。

不幸的是,静态链接比听起来要复杂得多。

关于c - gcc -nostdlib 和 mudflap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5777067/

相关文章:

linux - ifort mpi-openmp 段错误

regex - Grep/Sed 在两个多行标签之间

c - 如何获取结构成员的地址信息?

c++ - 减少内存分配 GCC 命令

c - 使用 pty 使用 GCC 编译时出错

c - void* 指向结构?

c - 我的代码中出现一个称为“期望表达式”的错误

c - 地址空间中未使用的内存是否受到保护

C - 图形,无法旋转多边形

linux - 为什么 NOP 的数量似乎会影响 shellcode 是否成功执行?