【问题标题】:How to link to a different libc file?如何链接到不同的 libc 文件?
【发布时间】:2011-02-13 06:53:43
【问题描述】:

由于版本差异,我想与我的程序一起提供共享库,而不是使用目标系统的。

ldd 说我的程序使用这些共享库:

linux-gate.so.1 =>  (0xf7ef0000)**(made by kernel)**  
libc.so.6 => /lib32/libc.so.6 (0xf7d88000)**(libc-2.7.so)**  
/lib/ld-linux.so.2 (0xf7ef1000)**(ld-2.7.so)**

我已经通过编译成功链接了 ld-xxx.so:

gcc -std=c99 -D_POSIX_C_SOURCE=200112L -O2 -m32 -s -Wl,-dynamic-linker,ld-2.7.so myprogram.c

但我没有成功链接libc-xxx.so。我该怎么做?

【问题讨论】:

  • 如果您只有一个可执行文件,您可能需要考虑静态链接您的程序。这样一来,没有人会意外丢失您的 libc 版本,并且如果他们删除您的程序,他们就不会保留您的 libc。

标签: c gcc linker ld libc


【解决方案1】:

我发现了怎么做:

rpath 指定提供的库的位置。此文件夹应包含:libc.so.6libdl.so.2libgcc_s.so.1 甚至更多。使用 strace 检查您的二进制文件使用了哪些库。

ld.so 是提供的链接器

gcc -Xlinker -rpath=/default/path/to/libraries -Xlinker -I/default/path/to/libraries/ld.so program.c

【讨论】:

  • 你也知道如何添加 libc 调试符号吗?
【解决方案2】:

-nodefaultlibs-nostdlib 传递给gcc 将告诉它不要将默认库作为参数传递给ld。然后,您将能够明确指定要链接的 libc。有关这两个选项的更多详细信息和注意事项,请参阅 gcc(1) 手册页。

【讨论】:

  • 请注意这篇文章是错误的。您不需要传递这两个标志中的任何一个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-18
  • 1970-01-01
  • 2020-02-16
  • 2021-11-09
  • 2021-06-10
  • 1970-01-01
  • 2016-10-04
相关资源
最近更新 更多