user-0 提问: 求解一个 ld 链接问题

回复:
user: user-1
content: C程序就应该用gcc来链接啊，你这样有意义吗？

user: user-2
content: 引用 11 楼 gjq_1988 的回复:[quote=引用 9 楼 dbzhang800 的回复:] [quote=引用 7 楼 gjq_1988 的回复:] [quote=引用 6 楼 dbzhang800 的回复:] 这只是举个例子，具体在那个路径下，具体叫什么名字，都是可以随编译器或你所用系统变化的。  我的ubuntu系统里没有crt0.o 但是有crt1.o和 crti.o 我把他们链进去后  还是那种情况：连接器不包错，运行的时候报错bash: ./test: No such file or directory  ps：而且我已经用-e main 参数指定了入口地址为main函数的地址，就算不链接crt0.o什么的也应该是可以的吧。。。  你可以试一下，就是无法运行，关键是链接完还不报错[/quote]  main 是C/C++ 程序的入口，但并不是真正的系统需要的入口函数，在调用main之前，C/C++ 运行库还要做大量其他工作的。[/quote]  我知道 但是我这里就是指定 我的main为进程入口， 不走_start ，不走系统运行时库，这是可以的，在《程序员的自我修养》里有这么干过[/quote] 可惜printf.c的功能依赖crt0.c中的相关初始化过程。我猜。

user: user-3
content: ldd test看下，应该是格式 不对

user: user-0
content: 引用 9 楼 dbzhang800 的回复:[quote=引用 7 楼 gjq_1988 的回复:] [quote=引用 6 楼 dbzhang800 的回复:] 这只是举个例子，具体在那个路径下，具体叫什么名字，都是可以随编译器或你所用系统变化的。  我的ubuntu系统里没有crt0.o 但是有crt1.o和 crti.o 我把他们链进去后  还是那种情况：连接器不包错，运行的时候报错bash: ./test: No such file or directory  ps：而且我已经用-e main 参数指定了入口地址为main函数的地址，就算不链接crt0.o什么的也应该是可以的吧。。。  你可以试一下，就是无法运行，关键是链接完还不报错[/quote]  main 是C/C++ 程序的入口，但并不是真正的系统需要的入口函数，在调用main之前，C/C++ 运行库还要做大量其他工作的。[/quote]  我知道 但是我这里就是指定 我的main为进程入口， 不走_start ，不走系统运行时库，这是可以的，在《程序员的自我修养》里有这么干过

user: user-4
content: 如果你真的这么想调用 ld，直接运行下面的命令  gcc -o test main.o -v  即可看到正常连接时，需要传递给链接器参数。而后把这一堆需要的东西传给你的 ld 即可

user: user-4
content: 引用 7 楼 gjq_1988 的回复:[quote=引用 6 楼 dbzhang800 的回复:] 这只是举个例子，具体在那个路径下，具体叫什么名字，都是可以随编译器或你所用系统变化的。  我的ubuntu系统里没有crt0.o 但是有crt1.o和 crti.o 我把他们链进去后  还是那种情况：连接器不包错，运行的时候报错bash: ./test: No such file or directory  ps：而且我已经用-e main 参数指定了入口地址为main函数的地址，就算不链接crt0.o什么的也应该是可以的吧。。。  你可以试一下，就是无法运行，关键是链接完还不报错[/quote]  main 是C/C++ 程序的入口，但并不是真正的系统需要的入口函数，在调用main之前，C/C++ 运行库还要做大量其他工作的。

user: user-2
content: 参考crt0.c的内容。

user: user-0
content: 引用 6 楼 dbzhang800 的回复:这只是举个例子，具体在那个路径下，具体叫什么名字，都是可以随编译器或你所用系统变化的。  我的ubuntu系统里没有crt0.o 但是有crt1.o和 crti.o 我把他们链进去后  还是那种情况：连接器不包错，运行的时候报错bash: ./test: No such file or directory  ps：而且我已经用-e main 参数指定了入口地址为main函数的地址，就算不链接crt0.o什么的也应该是可以的吧。。。  你可以试一下，就是无法运行，关键是链接完还不报错

user: user-4
content: 这只是举个例子，具体在那个路径下，具体叫什么名字，都是可以随编译器或你所用系统变化的。

user: user-5
content: 引用 4 楼 gjq_1988 的回复:[quote=引用 2 楼 user-5 的回复:] ld -o <output> /lib/crt0.o hello.o -lc This tells ld to produce a file called output as the result of linking the file "/lib/crt0.o" with "hello.o" and the library "libc.a", which will come from the standard search directories.   你好 ld: /lib/crt0.o: No such file: No such file or directory 我在/usr/lib 里没看到这个crt0.o 请问它的绝对路径在哪里 [/quote] find 一下咯

user: user-0
content: 引用 2 楼 user-5 的回复:ld -o <output> /lib/crt0.o hello.o -lc This tells ld to produce a file called output as the result of linking the file "/lib/crt0.o" with "hello.o" and the library "libc.a", which will come from the standard search directories.   你好 ld: /lib/crt0.o: No such file: No such file or directory 我在/usr/lib 里没看到这个crt0.o 请问它的绝对路径在哪里

user: user-0
content: 引用 1 楼 dbzhang800 的回复:直接用gcc链接多好啊  gcc -o test main.o  用ld的话，除指定C标准库外，C的 crt0 也需要指定，比如  ld -o test /lib/libcrt0.o main.o -lc  /usr/lib/libcrt0.o: No such file: No such file or directory

user: user-5
content: ld -o <output> /lib/crt0.o hello.o -lc This tells ld to produce a file called output as the result of linking the file "/lib/crt0.o" with "hello.o" and the library "libc.a", which will come from the standard search directories.

user: user-4
content: 直接用gcc链接多好啊  gcc -o test main.o  用ld的话，除指定C标准库外，C的 crt0 也需要指定，比如  ld -o test /lib/libcrt0.o main.o -lc