我正在尝试使用链接器脚本将一些用
__attribute__((common))
定义的变量重新定位到自定义部分,最好是在我选择的某个地址。我这样做的方法是使用 ld
选项提取 -Wl,--verbose
使用的默认链接描述文件,然后在该文件中潜入我的自定义输出部分指令。然后我的想法是使用 g++ 的 -T
选项传递该文件以在链接阶段使用。所以如果我有:
// a.h
int commonVar __attribute__((common));
// a.cc
#include "a.h"
int main() { commonVar = 22; return commonVar; }
在默认的链接描述文件中,我有这条微不足道的行:
SECTIONS {
.mycustomsec : { a.o(COMMON) }
}
通过此更改,当我使用 -T 选项传递此扩充文件时,在链接阶段,我不断收到
commonVar
的多个重新定义错误。我猜这是因为默认的链接描述文件 also 有针对 .bss
部分的指令,该部分处理 a.o again 并再次输出相同的相同符号。例如,除其他外,我在默认链接描述文件中也有这个:
.bss {
/* lots of other stuff too */
*(COMMON)
}
我怎样才能操纵脚本,以便我可以告诉链接器我已经处理了
a.o
的公共区域,所以请不要再处理它。