【发布时间】:2018-01-11 08:53:12
【问题描述】:
使用链接描述文件在地址空间中布局符号时,ld 允许
使用以下内容引用来自静态库的特定符号
语法:
archive.a:object_file.o(.section.symbol_name)
使用gold而不是ld,似乎这样的指令被忽略了。这
链接过程成功。然而,当使用这个指令来放置一个特定的
使用gold 在特定位置的符号并检查生成的符号布局
使用nm 或查看地图文件,该符号不在预期中
位置。
我使用静态编译的虚拟 hello world 程序制作了一个小测试用例 在其与 gcc 5.4.0 的关系中。 C 库是 musl libc(最后一次提交 来自官方 git 存储库的 master 分支)。对于 binutils,我也使用 来自官方 git 存储库的 master 分支上的最后一次提交。
我使用链接描述文件从静态文件中放置特定符号 (.text.exit)
库(musl C 库:libc.a)位于地址空间中的特定位置
即:.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存档?
【问题讨论】:
标签: linker ld binutils linker-scripts gold-linker