使用鏈接描述文件在地址空間中佈置符號時,ld
允許 引用來自靜態庫的特定符號,其語法如下 :使用GNU gold鏈接器引用靜態庫中的特定符號
archive.a:object_file.o(.section.symbol_name)
使用gold
而不是ld
,似乎這樣的指令被忽略。 鏈接過程成功。但是,當使用此指令將特定 符號放在特定位置gold
並使用nm
檢查生成的符號佈局 或查看映射文件時,符號不在預期的 位置中。
我用一個虛擬hello世界程序製作了一個小測試用例,其靜態編譯爲 ,其gcc版本爲5.4.0。 C庫是musl libc(最後一次在官方git倉庫的 master分支上提交)。對於binutils,我還使用官方git倉庫master分支上的 最後一次提交。
我使用鏈接腳本從靜態 庫(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:
# 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)
(使用-Map ld
/gold
標誌獲得)來編譯和鏈接我檢查的地圖文件後看看.text.exit
的位置。使用ld
作爲 鏈接器,它確實在文本部分的第一個位置。使用gold
,它不是 (它存在於地址空間的更遠處,就好像我的指令不是考慮到 一樣)。
現在,雖然既不gold
這些工作:
musl/lib/libc.a:exit.o(.text.exit);
musl/lib/libc.a(.text.exit)
這工作:
*(.text.exit);
的是,在gold
缺少功能?或者我做錯了什麼,也許有 使用gold
在 存檔中引用特定目標文件的特定符號的另一種方法?
非常感謝您使用引號語法工作。我還檢查了musl編譯標誌,實際上,這些包括-ffunction-sections。 –