【问题标题】:Linking a dynamically linked executable with ld使用 ld 链接动态链接的可执行文件
【发布时间】:2011-04-28 15:38:52
【问题描述】:

我正在尝试创建一个没有 gcc 的动态链接可执行文件 (elf_i386)。该程序非常简单(只有一个 printf)...这里的命令:

$ gcc -c simple.c
$ ld -o simple -dynamic-linker /lib/ld-linux.so.2 --entry main /usr/lib/crt1.o /usr/lib/crti.o simple.o -lc /usr/lib/crtn.o

可执行文件已创建,文件命令和 ldd 命令也显示正确的输出... 但是,当我在调用 printf 后启动程序时出现分段错误...我已经使用 objdump 检查了可执行文件,我认为问题出在 dtors 上...似乎编译为:

$gcc -o simple simple.c

一个 .dtors 节存在,而它不存在于直接使用 ld 创建的可执行文件中:(

有什么想法吗?

【问题讨论】:

  • 如果您需要任何人的帮助,您需要出示您的代码。

标签: linux linker ld


【解决方案1】:

丢失--entry mainmain 不是您的入口点,_start 是。试试这个:

$ gcc -c hello.c
$ ld -o hello -dynamic-linker /lib/ld-linux.so.2 /usr/lib/crt1.o /usr/lib/crti.o hello.o -lc /usr/lib/crtn.o
$ ./hello
hello, world
$ 

【讨论】:

  • 对于 x86_64 + C++,使用这个:ld -o hello hello.o --dynamic-linker /lib64/ld-linux-x86-64.so.2 /usr/lib64/crt1。 o /usr/lib64/crti.o -lstdc++ -lc /usr/lib64/crtn.o -L/usr/lib/gcc/x86_64-redhat-linux/4.1.2/ -lgcc_s -L /usr/lib64 替换.../x86_64-redhat-linux/ 目录,其中包含指向您的 libstd++.so 的正确路径,请使用“g++ -print-search-dirs”
  • 谢谢,神奇的是 -dynamic-linker /lib/ld-linux* /lib/crt*
【解决方案2】:

我猜没有必要包含C 运行时环境,除非您使用main() 中的return

我们可以剥离 CRT 并使用链接:

ld -o hello -lc -dynamic-linker /lib/ld-linux.so.2 hello.o -e main

会起作用的。

【讨论】:

  • 这适用于带有 glibc 的 Linux,因为 glibc 使用动态链接挂钩来调用其启动函数。如果您静态链接 glibc 并调用 printf 或 malloc 等函数而没有手动调用其 init 函数,则会出现段错误。 stackoverflow.com/questions/36861903/…
  • 其他平台如MinGW没有这个,需要手动从_start调用libc init函数才能使用部分函数。
猜你喜欢
  • 2011-06-07
  • 1970-01-01
  • 2021-05-22
  • 1970-01-01
  • 2023-02-24
  • 1970-01-01
  • 2019-07-17
  • 2010-11-20
  • 2013-08-15
相关资源
最近更新 更多