如何使用GNU ld将符号链接到特定的固定地址,以便二进制文件仍可以在Linux(x86)中正常执行?不会访问这些符号,但是它们的地址很重要。
例如,我将具有以下结构:
struct FooBar { Register32 field_1; Register32 field_2; //... }; struct FooBar foobar;
我想链接foobar到地址0x76543210,但通常会链接标准库和应用程序的其余部分。然后,应用程序将使用foobar的地址,但不会引用其后面的(可能不存在)内存。
foobar
此请求的基本原理是,可以在两个平台上使用相同的源:在本机平台上,Register32可以简单地是一个volatile uint32_t,但是在Linux上Register32是一个具有与a相同大小的C ++对象,该对象uint32_t定义了eg operator=,然后将使用该地址并向具有该地址(和数据)的通信框架发送请求,以在远程硬件上执行实际访问。因此,链接器将确保Register32结构的字段引用正确的“地址”。
Register32
volatile uint32_t
uint32_t
operator=
由litb提出的使用建议--defsym symbol=address确实可行,但是当您要映射数十个此类实例时,这会有些麻烦。但是,--just- symbols=symbolfile这只是窍门。我花了一段时间才能找出的语法symbolfile,这是
--defsym symbol=address
--just- symbols=symbolfile
symbolfile
symbolname1 = address; symbolname2 = address; ...
似乎需要空格,否则ld报告file format not recognized; treating as linker script。
ld
file format not recognized; treating as linker script