gcc和GNU ld链接器 – 使用强制固定地址/偏移生成静态链接代码

我有一个(相对较大的)静态二进制文件,我想用另一个替换一个函数.鉴于函数的复杂性,我想使用C和
gcc编译拼接函数,然后只需替换代码.为了实现这一点,显然,我需要以某种方式强制执行函数和某些全局变量,我将访问它们位于特定的偏移量.我如何使用gcc和ld做到这一点?

一个非常简单的例子 – 给出一个这样的程序:

int global = 42;
int get_global() { return global; }

int main() {
    return get_global();
}

编译和反汇编此函数会产生以下结果:

00000000004004ad <get_global>:
  4004ad:       55                      push   %rbp
  4004ae:       48 89 e5                mov    %rsp,%rbp
  4004b1:       8b 05 61 04 20 00       mov    0x200461(%rip),%eax        # 600918 <global>
  4004b7:       5d                      pop    %rbp
  4004b8:       c3                      retq   

注意:

>全局变量的地址为0x600918
> get_global获得了0x4004ad

基本上,问题是,我如何使用gcc和ld来生成一个函数的代码:

>在所提到的确切地址上引用全局变量和/或函数
>从我希望开始的地址开始(我特别感兴趣的是从地址0x4004ad开始,所以它可能用于拼接现有的get_global实现)

我认为可以使用为函数原型和/或全局变量指定的一些编译指示或特定于编译器的属性,实际上是gcc has some variables attributes that control packing and placement of functions/variables in certain sections,但是不可能指定固定地址.

我强烈怀疑它可以通过手动调用ld和使用一些ld链接器脚本魔法来完成,但a quick look at its documentation似乎没有给我任何铃声.我错过了什么吗?

绝对相关:Fixed address variable in C

最佳答案 我之前已经看过,使用ASM文件将变量固定到特定地址.这特别用于共享内存中使用的全局变量.

在任何其他源文件中,您显然需要声明全局变量extern

因此,只使用您的变量编写一个简短的asm文件,并将其与其余代码进行编译和链接.

点赞