gpt4 book ai didi

gcc - 二进制 AND (&) 的无效操作数

转载 作者:行者123 更新时间:2023-12-03 23:21:44 26 4
gpt4 key购买 nike

我有这个“程序集”文件(仅包含 directives )

// declare protected region as somewhere within the stack
.equiv prot_start, $stack_top & 0xFFFFFF00 - 0x1400
.equiv prot_end, $stack_top & 0xFFFFFF00 - 0x0C00

结合此链接描述文件:
SECTIONS {
"$stack_top" = 0x10000;
}

组装产生这个输出

file.s: Assembler messages:
file.s: Error: invalid operands (*UND* and *ABS* sections) for `&' when setting `prot_start'
file.s: Error: invalid operands (*UND* and *ABS* sections) for `&' when setting `prot_end'

我怎样才能使这项工作?

最佳答案

为什么不可能?

您已链接到 GAS 文档,但这种无能的理由是什么?

答:GAS 必须通过 ELF 目标文件将操作传达给链接器,并且唯一可以像这样传达的东西是 +-(- 只是 + 一个负值)。所以这是 ELF 格式的一个基本限制,而不仅仅是 GAS 开发人员的懒惰。

当 GAS 编译为目标文件时,会跟随一个链接步骤,重定位将决定符号的最终值。

问题:为什么可以传递 + 而不能传递 &

答案:因为 + 是可传递的: (a + b) + c == a + (b + c)+& 不是“一起传递”: (a & b) + c!= a & (b + c)

让我们看看 + 是如何通过 ELF 格式传达的,以说服自己 & 是不可能的。

不熟悉的先了解一下什么是重定位:https://stackoverflow.com/a/30507725/895245

让我们用另一个会产生相同错误的例子来最小化你的例子:

a: .long s
b: .long s + 0x12345678
/* c: .long s & 1 */
s:

编译和反编译:
as --32 -o main.o main.S
objdump -dzr main.o

输出包含:
00000000 <a>:
0: 08 00 or %al,(%eax)
0: R_386_32 .text
2: 00 00 add %al,(%eax)

00000004 <b>:
4: 80 56 34 12 adcb $0x12,0x34(%esi)
4: R_386_32 .text

忽略反汇编,因为这不是代码,只看符号、字节和重定位。

我们有两个 R_386_32 重定位。根据 IA-32 的 System V ABI(定义 ELF 格式),这种类型的重定位计算如下:
S + A

在哪里:
  • S :目标文件中重定位前的值。

    重定位前 a 的值 == 08 00 00 00 == 8 小端

    重定位前 b 的值 == 80 56 34 12 == 0x12345680 in little endian
  • A :加数,重定位条目的一个字段,这里是 0 (objdump 未显示),所以让我们忘记它。

  • 当搬迁发生时:
  • a 将被替换为:
    address of text section + 8

    有一个 + 8 因为 s: 是文本部分的第 8 个字节,前面是 2 个 long。
  • b 将被替换为:
     address of text section + (0x12345678 + 8)
    ==
    address of text section + 0x12345680

    啊哈,这就是 0x12345680 出现在目标文件中的原因!

  • 所以正如我们刚刚看到的,可以通过添加到实际偏移量来表达 ELF 文件上的 +

    但是用这种机制(或我知道的任何其他机制)表达 & 是不可能的,因为我们不知道重定位后文本部分的地址是什么,所以我们不能将 & 应用于它。

    关于gcc - 二进制 AND (&) 的无效操作数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18495765/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com