linux - 将符号链接(symbolic link)到 Linux 上的固定地址

标签 linux gcc linker gnu ld

如何使用 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/

相关文章:

linux - 将 cer 转换为 pem 时出现 OpenSSL 编码错误

c - 我不小心换了一个shell命令。有什么办法可以恢复我的源代码吗?

C++ - g++ 链接错误的 stdlibc++

linux - 永久链接到其他共享库

python - 代理服务器解决对自己的请求

linux - 引导安装在 virtualbox 中的 ubuntu 16.04 时出现错误 "no valid rapl domains found in package 0"

c++ - SQL 控制台应用程序中的 MFC 库

c - GCC 与内部函数不兼容的指针类型警告

c++ - 项目使用旧版本的boost库

c++ - 可以将不同的 GCC 方言联系在一起吗?