首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用ld链接gcc生成的obj文件

如何使用ld链接gcc生成的obj文件
EN

Stack Overflow用户
提问于 2013-11-11 06:41:12
回答 1查看 1.8K关注 0票数 1

这些天,我正在阅读APUE,自己设置Makefile,而不是使用该书网站提供的现有.mk Makefile。我的Makefile是这样的:

代码语言:javascript
复制
CC=gcc
LD=ld
CC_FLAGS= -c -I ./include/ -Wall -Wextra
LD_FLAGS= -e main -lc
LIB_OBJS= ./lib/*.o #There'are about 30 .c files in lib, \
most of which are wrap of error handling routines or simplified APIs. \
So I don't copy them all in the code block

all: 

ls: ls.c $(LIB_OBJS)
        $(CC) $(CC_FLAGS) -o ls.o ls.c
        $(LD) $(LD_FLAGS) -o ls ls.o ./lib/error.o

$(LIB_OBJS):
        cd ./lib; \
        make

clean:
        cd ./lib; \
        make clean
        rm ./ls

./lib中的Makefile与这个文件非常相似,因为它只是gcc -c该目录中的所有.c文件,并且不做任何链接工作。而ls.c是第一章中的第一段代码,它只列出给定dirent的每个元素。我的问题是,我的Makefile可以生成一个可执行文件,而不需要打印任何错误,但是这个文件根本无法执行。每当具有x特权的i ./ls时,bash返回:

代码语言:javascript
复制
bash: ./ls: No such file or directory

但是,如果我使用gcc将ls.o和./lib/error.o链接在一起,它的工作就会很顺利。所以我想知道gcc引用的东西有什么特别之处。如果我只用ld来连接gcc生产的东西,我该怎么办?事先谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-11 07:00:13

我不知道您使用的是哪条工具链,但是gcc传递给链接器的默认库很少,只有您指定的库,例如libc。

下面是gcc的-v选项的部分输出,它告诉我们链接器步骤:

使用BFD版本2.17.50.0.6-12.el5 (i 386-redhat-linux)使用BFD版本2.17.50.0.6-12.el5 20061020 /usr/libexec/gcc/i386-redhat-linux/4.1.2/collect2 -eh-frame-hdr -m elf_i386 -散列样式= GNU -动态链接器/lib/ld-linux.so.2 -o y.o /usr/lib/gcc/i 386-redhat-linux/4.1.2/../crt1.o /usr/lib/gcc/i386-redhat-linux/4.1.2/../../../crti.o /usr/lib/gcc/i386-redhat-linux/4.1.2/crtbegin.o -L/usr/lib/gcc/i 386-linux/4.1.2-L/usr/lib/gcc/i 386-linux/4.1.2-L/usr/lib/usr/i 386-红帽-linux/4.1.2/././tmp/ccS39C4x.o -lgcc -as-as- -lgcc_s -不需要的-lc -lgcc -as- -lgcc_s -no-as-as--lgcc_s/usr/lib/gcc/i 386-redhat-linux/4.1.2/crten.o-lgcc

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19900317

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档