首页 文章

gcc -nostdlib和mudflap

提问于
浏览
1

我需要在另一个没有安装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并手动附加lib但是会出现以下错误:

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中的那个?

  • 必须包含哪些其他标志才能使其正确编译?

2 回答

  • 0

    不要尝试静态链接库,而是将它们与可执行文件一起使用,并使LD_LIBRARY_PATH或rpath指向包含它们的目录 .

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

    只要您不使用在编译和目标系统之间获得版本化更新的符号,您就可以使用更新的系统 .

    遗憾的是,静态链接比听起来要复杂得多 .

  • 0

    没那么复杂 . 使用strace找出你的二进制文件链接到哪些库 .

    gcc -Xlinker -rpath = / path / to / provided / libs -Xlinker -I / path / to / provided / linker / ld-2.11.2.so -std = c99 -D_POSIX_C_SOURCE = 200112L -fmudflap / path / to / provided /mudflap/libmudflap.so.0 simple.c

相关问题