Linux 使用ld链接动态链接的可执行文件

Linux 使用ld链接动态链接的可执行文件,linux,linker,ld,Linux,Linker,Ld,我正在尝试创建一个没有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后启动

我正在尝试创建一个没有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检查了可执行文件,我认为问题在于DTR…似乎是用以下方法编译的:

$gcc -o simple simple.c
节.dtors存在,但它不存在于直接使用ld创建的可执行文件中:(

有什么想法吗?

丢掉
--entry main
main
不是你的入口点,
\u 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
$ 

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

我们可以使用以下方法剥离CRT并进行链接:

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

对于X86My64 + C++,使用它:LD—O您好,OL/LB64/LD-LIUX-X8664。O/USR/LIb64/CRTI。O-LSTDC++-LC/UR/LB64/CRTN。O -L/USR/LIB/GC/CC/X86Y64-RADHAT-Linux/4.1.2/-LGCCSY-L/UR/LB64取代…/X86YE6HADH-Linux/DIR

将生效。

如果需要任何人的帮助,你需要显示你的代码。使用libstd++的正确路径。因此,请使用“g++-print search dirs”谢谢,神奇的是-dynamic linker/lib/ld linux*/lib/crt*这在使用glibc的linux上是有效的,因为glibc使用动态链接钩子来调用它的启动函数。如果你静态链接glibc并调用printf或malloc等函数,而没有手动调用它的init函数,那么你就会出错。其他平台,如MinGW,则不会如果没有这个功能,您需要从
\u start
手动调用libc init函数,然后才能使用某些函数。