リンカスクリプトを使用してアドレス空間にシンボルをレイアウトする場合、ld
は に、 の構文を持つ静的ライブラリからの特定のシンボルを参照できます。GNUゴールドリンカーを使用したスタティックライブラリの特定のシンボルの参照
archive.a:object_file.o(.section.symbol_name)
はgold
ではなくld
を使用して、そのような指示を無視しているようです。 リンク処理は成功します。ただし、特定の場所に特定の シンボルを配置してgold
とし、結果のシンボルレイアウト を使用してnm
を使用するか、またはマップファイルを参照する場合、シンボルは予定されている の位置にありません。
gcc 5.4.0のentretyに、 という静的にコンパイルされたダミーのhelloワールドプログラムを使用して小さなテストケースを作成しました。 Cライブラリはmusl libc(公式のgitリポジトリの マスターブランチの最後のコミット)です。 binutilsについては、公式のgitリポジトリのmasterブランチで最後にコミットした も使用します。
Iは、静的 ライブラリ(MUSL Cライブラリ:libc.a
)から、特定のシンボル(.text.exit
)を配置するリンカスクリプトを使用する:.text
セクションの最初の位置であるアドレス空間 の特定の場所に。
私のリンカスクリプトは次のとおりです。
ENTRY(_start)
SECTIONS
{
. = 0x10000;
.text :
{
/* Forcing .text.exit in the first position in .text section */
musl/lib/libc.a:exit.o(.text.exit);
*(.text*);
}
. = 0x8000000;
.data : { *(.data*) }
.rodata : { *(.rodata*) }
.bss : { *(.bss*) }
}
私のMakefile:(-Map ld
/gold
フラグを使用して得られた)私は、マップファイルをチェックしていコンパイルとリンクした後
# Set this to 1 to link with gold, 0 to link with ld
GOLD=1
SRC=test.c
OBJ=test.o
LIBS=musl/lib/crt1.o \
musl/lib/libc.a \
musl/lib/crtn.o
CC=gcc
CFLAGS=-nostdinc -I musl/include -I musl/obj/include
BIN=test
LDFLAGS=-static
SCRIPT=linker-script.x
MAP=map
ifeq ($(GOLD), 1)
LD=binutils-gdb/gold/ld-new
else
LD=binutils-gdb/ld/ld-new
endif
all:
$(CC) $(CFLAGS) -c $(SRC) -o $(OBJ)
$(LD) --output $(BIN) $(LDFLAGS) $(OBJ) $(LIBS) -T $(SCRIPT) \
-Map $(MAP)
clean:
rm -rf $(OBJ) $(BIN) $(MAP)
へ.text.exit
の場所を見てください。 ld
を リンカとして使用すると、実際にはテキストセクションの最初の位置にあります。 gold
を使用すると、 は存在しません(私の指示文には が考慮されていないかのように、アドレス空間にはさらに存在します)。今
、どちらもgold
これらの作業の間、この作品
musl/lib/libc.a:exit.o(.text.exit);
musl/lib/libc.a(.text.exit)
:
*(.text.exit);
はgold
でその不足している機能ですか?または私は間違って何かをしているのでしょうか? 具体的なオブジェクトファイルの特定のシンボルを アーカイブで参照する別の方法は、gold
を使用していますか?
アーカイブ:
をありがとうございました、引用符を使用する構文は、働いていました。私はmuslコンパイルフラグもチェックしていましたが、実際にはこれらの関数セクションが含まれています。 –