一尘不染

在Linux上将符号链接到固定地址

linux

如何使用GNU ld将符号链接到特定的固定地址,以便二进制文件仍可以在Linux(x86)中正常执行?不会访问这些符号,但是它们的地址很重要。

例如,我将具有以下结构:

struct FooBar {
    Register32 field_1;
    Register32 field_2;
    //...
};

struct FooBar foobar;

我想链接foobar到地址0x76543210,但通常会链接标准库和应用程序的其余部分。然后,应用程序将使用foobar的地址,但不会引用其后面的(可能不存在)内存。

此请求的基本原理是,可以在两个平台上使用相同的源:在本机平台上,Register32可以简单地是一个volatile uint32_t,但是在Linux上Register32是一个具有与a相同大小的C ++对象,该对象uint32_t定义了eg
operator=,然后将使用该地址并向具有该地址(和数据)的通信框架发送请求,以在远程硬件上执行实际访问。因此,链接器将确保Register32结构的字段引用正确的“地址”。


阅读 433

收藏
2020-06-03

共1个答案

一尘不染

由litb提出的使用建议--defsym symbol=address确实可行,但是当您要映射数十个此类实例时,这会有些麻烦。但是,--just- symbols=symbolfile这只是窍门。我花了一段时间才能找出的语法symbolfile,这是

symbolname1 = address;
symbolname2 = address;
...

似乎需要空格,否则ld报告file format not recognized; treating as linker script

2020-06-03