如何根据名称在地址上使用GNU链接器放置ELF节?

时间:2016-06-03 15:04:01

标签: gcc linker arm linker-scripts

我试图整理一个GNU链接器脚本,它放置两种类型的部分:

  • 固定和预定义地址的正常部分。 .text的{​​{1}},0x100000的{​​{1}},.data的{​​{1}}等等
  • 根据他们的名字特殊部分。例如,0x200000应放在地址.bss

第一种类型是微不足道的,随处可见。没问题。

我遇到的问题是第二种类型。我无法弄清楚如何处理某个部分的名称,将其转换为放置部分的地址。上面例子中使用的0x300000前缀可以自由选择。

我之前使用的是ARM RVCT链接器(__at_0x13370000),其中0x13370000(其中__at_是十进制或十六进制值)的架构中命名的任何部分都放在相应的位置地址。 http://infocenter.arm.com/help/topic/com.arm.doc.dui0803e/pge1362066000571.html

我想切换到GCC工具链和GNU链接器,但为了实现这一点,我需要以某种方式复制这种行为。

由于

1 个答案:

答案 0 :(得分:0)

您可以在链接之前从目标文件中提取节地址,并为链接描述文件生成一个小的加数:

readelf -t *.o \
  | grep -o '^ *\[ *[0-9]\+\] \.[a-zA-Z_0-9]\+_at_[x0-9]\+' \
  | sed 's!.*\(\..*\)_at_\([x0-9]\+\).*!\1_at_\2 \2!' \
  | sort -u \
  | while read name addr; do
    cat <<EOF
$name $addr:
{
  KEEP(*($name)) ;
}
EOF
  done > fixed.lds

fixed.lds现在可以INCLUDE添加到主链接描述文件中。