如何使用 GNU ld 将(某些)符号链接(symbolic link)到特定的固定地址,以便二进制文件仍可以在 Linux (x86) 中正常执行?不会对这些符号进行任何访问,但它们的地址很重要。
例如,我有以下结构:
struct FooBar {
Register32 field_1;
Register32 field_2;
//...
};
struct FooBar foobar;
我想将 foobar
链接到地址 0x76543210,但正常链接标准库和应用程序的其余部分。然后应用程序将使用 foobar 的地址,但不会引用它背后的(可能不存在的)内存。
此请求的基本原理是同一源可以在两个平台上使用:在 native 平台上,Register32
可以简单地是一个 volatile uint32_t
,但在 Linux 上Register32
是一个 C++ 对象,其大小与定义例如 uint32_t
的对象相同。 operator=
,然后它将使用对象的地址并向具有该地址(和数据)的通信框架发送请求以执行对远程硬件的实际访问。因此,链接器将确保结构的 Register32
字段引用正确的“地址”。
最佳答案
litb 建议使用 --defsym symbol=address
确实有效,但是当您有几十个这样的实例要映射时有点麻烦。但是,--just-symbols=symbolfile
就可以了。我花了一段时间才找出 symbolfile
的语法,也就是
symbolname1 = address;
symbolname2 = address;
...
空格似乎是必需的,否则 ld
报告 文件格式无法识别;视为链接器脚本
。
关于linux - 将符号链接(symbolic link)到 Linux 上的固定地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/495262/