【问题标题】:GNU ld: What is the difference between these two linker scripts?GNU ld:这两个链接描述文件有什么区别?
【发布时间】:2013-05-17 14:34:08
【问题描述】:

起初它看起来像是软件工程师的“找不同”游戏, 但语法上的微小差异显然会对链接行为产生巨大影响。

ldscript1:

OUTPUT_FORMAT(elf64-x86-64)
ENTRY(main)
ABS_FIRST = 0x10000000;
OFF_SECOND = 0x20000000;
SECTIONS
{
    . = ABS_FIRST;
    .first :
    {
        *(.pre)
    }
    . += OFF_SECOND;
    .text :
    {
        *(.text)
        *(.rodata*)
    }
    .data :
    {
        *(.data)
    }
}

ldscript2:

OUTPUT_FORMAT(elf64-x86-64)
ENTRY(main)
ABS_FIRST = 0x10000000;
OFF_SECOND = 0x20000000;
SECTIONS
{
    . = ABS_FIRST;
    .first :
    {
        *(.pre)
    }
    hack = .;
    . = hack + OFF_SECOND;
    .text :
    {
        *(.text)
        *(.rodata*)
    }
    .data :
    {
        *(.data)
    }
}

前:

.section .pre
.long 0x0

main.c:

int main()
{
}

编译和链接:

gcc -c -xassembler-with-cpp -o pre.o pre.s
gcc -c -o main.o main.c
ld -T ldscriptX pre.o main.o -o example

旧版本:

$ ld -v
GNU ld (GNU Binutils for Ubuntu) 2.22

使用 ldscript1:

$ objdump -h example | grep -E ".text|VMA"
Idx Name          Size      VMA               LMA               File off  Algn
  2 .text         00000006  0000000020000000  0000000020000000  00200000  2**2

使用 ldscript2:

$ objdump -h example | grep -E ".text|VMA"
Idx Name          Size      VMA               LMA               File off  Algn
  2 .text         00000006  0000000030000004  0000000030000004  00200004  2**2

请注意,对于 ldscript2,VMA 是正确的,但不知何故“。”在 ldscript1 中的“+=”操作之前/中被设置回零。我已阅读 GNU ld 文档,但找不到解释。

【问题讨论】:

    标签: linker gnu ld


    【解决方案1】:

    在我看来,ldscript1 的行为符合预期...

    这看起来像是一个相对/绝对地址问题。 hack 的价值是什么?我怀疑是0。

    你可以试试hack = ABSOLUTE(.) ; 吗?

    【讨论】:

      猜你喜欢
      • 2019-11-27
      • 2018-11-09
      • 2014-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-23
      • 2015-05-02
      • 2016-01-17
      相关资源
      最近更新 更多