25

glibc 2.14 をビルドし、 directory にインストールしました~/GLIBC/glibc_install。システムのデフォルトの C ライブラリの代わりに、この C ライブラリを使用してプログラムをビルドして実行したいと考えています。

  • カスタム glibc を使用していることを確認するためにglibc/stdio-common/printf.c:__printf、メッセージを出力する puts の呼び出しを追加しました。

  • 次に、glibc を再構築して再インストールしました。

  • 次に、「Hello, World」プログラムを作成し、次のようにコンパイルしてリンクしようとしました。

    gcc -nodefaultlibs -static -lgcc -L~/GLIBC/glibc_install/lib -o myprog myprog.c
    

しかし、次のリンカ エラー レポートが表示されます。

/usr/lib/gcc/x86_64-linux-gnu/4.4.3/../../../../lib/crt1.o: In function `_start':
(.text+0x19): undefined reference to `__libc_csu_init'
/usr/lib/gcc/x86_64-linux-gnu/4.4.3/../../../../lib/crt1.o: In function `_start':
(.text+0x25): undefined reference to `__libc_start_main'
/tmp/ccACTQEp.o: In function `main':
c1.c:(.text+0xa): undefined reference to `puts'
collect2: ld returned 1 exit status

私は何を間違っていますか?

4

3 に答える 3

26

glibc ヘルプ メーリング リスト (libc-help@sourceware.org) からのいくつかの提案に従って、解決策があります。通常は自動的に (そして黙って) インクルードするすべてのものを省略し、一連の開始ファイルと終了ファイルを含め、必要なものすべてをインクルードするようにリンカに指示する必要があるため、このタスクは少しトリッキーであることがわかります。開始ファイルと終了ファイルの一部は libc から取得され、一部は gcc から取得されるため、make ルールは少し複雑です。以下は、アプローチを説明するための一般的なサンプル makefile です。prog.cというソース ファイルからprogというプログラムを作成し、カスタム glibc をディレクトリ/home/my_acct/glibc_installにインストールしたと仮定します。

TARGET = prog
OBJ = $(TARGET).o
SRC = $(TARGET).c
CC = gcc
CFLAGS = -g
LDFLAGS = -nostdlib -nostartfiles -static
GLIBCDIR = /home/my_acct/glibc_install/lib
STARTFILES = $(GLIBCDIR)/crt1.o $(GLIBCDIR)/crti.o `gcc --print-file-name=crtbegin.o`
ENDFILES = `gcc --print-file-name=crtend.o` $(GLIBCDIR)/crtn.o
LIBGROUP = -Wl,--start-group $(GLIBCDIR)/libc.a -lgcc -lgcc_eh -Wl,--end-group

$(TARGET): $(OBJ)
        $(CC) $(LDFLAGS) -o $@ $(STARTFILES) $^ $(LIBGROUP) $(ENDFILES) 

$(OBJ): $(SRC)
        $(CC) $(CFLAGS) -c $^

clean:
        rm -f *.o *.~ $(TARGET)
于 2012-05-27T06:15:19.280 に答える
6

あなたのコマンドラインはただの偽物です。試す:

gcc -nodefaultlibs -static -L~/GLIBC/glibc_install/lib -o myprog myprog.c -lgcc -lc -lgcc -lc

または類似。を省略-lcし、入力ファイルの前に誤ってライブラリを持っていました。

libibgccそして、あなたはむしろlibgcc...というライブラリを探していました。

于 2012-05-26T04:10:33.840 に答える