我将使用一个简单的具体例子来说明我正在尝试做什么。
文件 main.c:
#include <stdio.h>
unsigned int X;
int main()
{
printf("&X = 0x%zXrn", &X);
return 0;
}
我想知道是否有可能(使用链接器脚本/gcc 选项)在编译/链接时手动指定X
地址,因为我知道它位于内存中的某个地方,在我的可执行文件之外。
只想知道这是否可能,我知道我可以使用指针(即 unsigned int*
) 访问特定的内存位置 (r/w),但这不是我想要的。
我想要的是让 GCC 生成代码,其中对全局变量/静态函数变量的所有访问要么通过间接级别完成,即通过指针(-fPIC
不够好,因为静态全局变量不是通过 GOT 访问的)或者它们的地址可以手动指定(在链接/编译时)。
谢谢
我所追求的是让 GCC 生成所有访问的代码 全局变量/静态函数变量...他们的地址可以是 手动指定(在链接/编译时)。
可以使用链接器命令指定.bss
节和.data
节(分别包含未初始化和初始化的变量)的地址。变量在各部分中的相对位置取决于编译器/链接器。
如果您只需要放置单个变量,这可以通过extern
声明它们并在文件中指定它们的地址来完成,例如 addresses.ld
:
X = 0x12345678;
(注意:=
需要空格),它被添加到编译器/链接器参数中:
cc main.c addresses.ld