2

如何告诉 lld 将代码放置在某个位置或上方?

我有一段遗留代码依赖于一段相当有问题的逻辑:某个函数可以接收一个值,该值要么表示函数指针数组的索引,要么实际上是函数指针。该函数通过检查值是否小于来确定值的类型0x10000;如果是这样,它是一个索引。如果不是,它是一个函数指针。

尽管我真的很想,但我无法更改这段代码。

不幸的是,测试甚至不起作用:在 OSX 上(它还没有对其他地方的任何人造成问题),程序中的函数指针的地址可能比阈值低得多,这意味着有问题的函数可以检测到它们作为索引而不是指针,一切都会出错。

有没有我可以给链接器的指令——在这种情况下是 lld——强制它把所有生成的代码放在上面或上面0x10000,这样这个问题就会消失,直到有人可以修复这个荒谬的测试?

我尝试了该-sectalign选项,但这给出了以下错误:

ld:-sectalign 的参数必须小于或等于 0x8000

0x8000还不够;代码仍然放置在它之间的空间中,0x10000并且逻辑仍然失败。

我可以使用其他选项来执行此操作吗?

4

1 回答 1

1

您将需要编写链接描述文件。LLD 支持GNU LD 样式的链接器脚本。它们看起来像:

SECTIONS
{
  . = 0x10000;
  .text : { *(.text) }
  . = 0x8000000;
  .data : { *(.data) }
  .bss : { *(.bss) }
}

该脚本会将 .text 部分放置在 0x8000000 处。

于 2020-10-27T15:08:28.833 回答