1

我将使用一个简单的具体示例来说明我正在尝试做的事情。

文件main.c

#include <stdio.h>

unsigned int X;

int main()
{
    printf("&X = 0x%zX\r\n", &X);
    return 0;
}

我想知道是否可以(使用链接器脚本/gcc 选项)X在编译/链接时手动指定地址,因为我知道它位于内存中的某个位置,在我的可执行文件之外。

我只想知道这是否可能,我知道我可以使用指针(即unsigned int*)来访问特定的内存位置(r/w),但这不是我想要的。

我所追求的是让 GCC 生成代码,其中对全局变量/静态函数变量的所有访问要么通过间接级别完成,即通过指针(-fPIC不够好,因为静态全局变量不能通过 GOT 访问)或它们地址可以手动指定(在链接/编译时)。

谢谢

4

1 回答 1

1

我所追求的是让 GCC 生成代码,其中所有对全局变量/静态函数变量的访问......它们的地址可以手动指定(在链接/编译时)。

您可以使用链接器命令指定.bss.data部分的地址(分别包含未初始化和已初始化的变量)。各节中变量的相对位置取决于编译器/链接器。

如果您只需要放置单个变量,可以通过声明它们extern并在文件中指定它们的地址来完成,例如addresses.ld

X = 0x12345678;

(注意:需要空格=),它被添加到编译器/链接器参数中:

cc main.c addresses.ld
于 2015-10-06T09:06:01.503 回答