链接dynamic链接的可执行文件与ld

我试图创build一个dynamic链接的可执行文件(elf_i386)没有gcc。 该程序是非常简单的(只有一个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 

可执行文件创build,也是文件命令和ldd命令显示正确的输出…但是,当我启动程序后调用printf我得到一个分段错误…我已经用objdump检查可执行文件,我认为这个问题是关于dtors …似乎编译与:

 $gcc -o simple simple.c 

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

有任何想法吗?

失去 – --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 $ 

除非您使用main() return ,否则不需要包含C运行时环境。

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

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

将工作。