使用链接器脚本重定位变量

问题描述 投票:0回答:0

我正在尝试使用链接器脚本将一些用

__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
的公共区域,所以请不要再处理它。

c++ g++ ld linker-scripts
© www.soinside.com 2019 - 2024. All rights reserved.