1

最近、私は APUE を読んで、本の Web サイトで提供されている既存の .mk Makefile を使用する代わりに、自分で 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 は、そのディレクトリ内のすべての .c ファイルを gcc -c するだけで、リンク作業を行わないため、これとほとんど同じです。そして、ls.c は、与えられた dirent のすべての要素をリストするだけの第 1 章の最初のコードです。私の問題は、私のMakefileはエラーを出力せずに実行可能ファイルを生成できますが、このファイルはまったく実行可能ではないということです。x 特権で ./ls を実行すると、bash は次のように返します。

bash: ./ls: No such file or directory

しかし、gcc を使用して ls.o と ./lib/error.o をリンクすると、スムーズに動作します。そこで、gcc の ld 呼び出しの何が特別なのだろうと考えました。ld だけを使用して gcc で生成されたものをリンクする場合はどうすればよいですか? よろしくお願いします!

4

1 に答える 1

3

どのツールチェーンを使用しているかはわかりませんが、指定したもの以外に gcc がリンカーに渡すデフォルトのライブラリはほとんどありません。たとえば、libc などです。

これは、リンカのステップについて説明する -v オプションを指定した gcc の出力の一部です。

BFD バージョン 2.17.50.0.6-12.el5 を使用する GNU アセンブラー バージョン 2.17.50.0.6-12.el5 (i386-redhat-linux) 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

于 2013-11-11T07:00:13.013 に答える