我有一个(相对较大的)静态二进制文件,我想用另一个替换一个函数.鉴于函数的复杂性,我想使用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文件,并将其与其余代码进行编译和链接.