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

时间:2013-11-11 06:41:13

标签: c linux gcc makefile

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

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 CAN PRODUCE可执行文件没有打印任何错误但该文件根本不可执行。每当我使用x权限./ls时,bash返回:

bash: ./ls: No such file or directory

但是,如果我使用gcc链接ls.o和./lib/error.o一起工作顺利。所以我想知道gcc的ld调用有什么特别之处。如果我只使用ld链接gcc制作的东西怎么办? 先谢谢!

1 个答案:

答案 0 :(得分:4)

我不确定您使用的是什么工具链,但是gcc传递给链接器的默认库很少,而不是您指定的那些,例如libc

以下是带有-v选项的gcc的部分输出,它告诉链接器步骤:

GNU汇编程序版本2.17.50.0.6-12.el5(i386-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 --hash-style = gnu -dynamic-linker / lib / ld-linux.so.2 -o yo /usr/lib/gcc/i386-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/i386-redhat-linux/4.1.2 -L / usr / lib / gcc / i386-redhat-linux / 4.1.2 -L / usr / lib / gcc / i386-redhat-linux / 4.1.2 /。 ./../ ../tmp/ccS39C4x.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed / usr / lib / gcc / i386-redhat-linux / 4.1.2 / crtend.o /usr/lib/gcc/i386-redhat-linux/4.1.2 /../../../ crtn.o