我试图整理一个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链接器,但为了实现这一点,我需要以某种方式复制这种行为。
由于
答案 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
添加到主链接描述文件中。