在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
结构的字段引用正确的“地址”。
回答:
由litb提出的使用建议--defsym symbol=address
确实可行,但是当您要映射数十个此类实例时,这会有些麻烦。但是,--just-
symbols=symbolfile这只是窍门。我花了一段时间才能找出的语法symbolfile
,这是
symbolname1 = address;symbolname2 = address;
...
似乎需要空格,否则ld
报告file format not recognized; treating as linker script
。
以上是 在Linux上将符号链接到固定地址 的全部内容, 来源链接: utcz.com/qa/412048.html