【问题标题】:GCC, linker-script: Variables that resolve to manually defined addresses?GCC,链接器脚本:解析为手动定义地址的变量?
【发布时间】:2015-06-21 17:32:43
【问题描述】:

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

文件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 生成代码,其中 all 访问全局变量/静态函数变量要么通过间接级别完成,即通过指针(-fPIC 不够好,因为 static 全局变量不能通过 GOT 访问)或者可以手动指定它们的地址(在链接/编译时)。

谢谢

【问题讨论】:

    标签: pointers gcc global-variables indirection


    【解决方案1】:

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

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

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

    X = 0x12345678;
    

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

    cc main.c addresses.ld
    

    【讨论】:

      猜你喜欢
      • 2011-08-08
      • 1970-01-01
      • 2017-06-14
      • 1970-01-01
      • 2015-07-28
      • 1970-01-01
      • 1970-01-01
      • 2023-02-04
      • 2018-07-11
      相关资源
      最近更新 更多