GCC - 将共享库的数据部分重新定位到特定的内存位置
GCC - Relocate data section of a shared library to specific memory location
我正在寻找一种方法 relocate/load 共享库的用户定义数据部分到 C 程序的特定虚拟内存。
最初,我只使用静态库 (.a) 来 link 整个程序。其中一些库(其中 2 个,我们调用 libdata1.a 和 libdata2.a)只是初始化结构的集合。一种“基于C的数据库文件”。
出于某些兼容性原因,这些库的“数据部分”需要加载到最终程序中的特定内存位置。
在静态情况下,我只是修改了 ld 脚本以添加一个规则来实现它,并且一切正常。
.usrdata1 0x04200000 : { *(.usrdata1 ) } /* data1 is the renamed data section of libdata1 */
.usrdata2 0x04300000 : { *(.usrdata2 ) } /* data2 is the renamed data section of libdata2 */
但是现在,我需要一个解决方案来以动态方式加载这两个库(或它们嵌入的数据部分)。所以库将与最终的二进制文件分离。我考虑过使用共享库 (.so),但是动态 linker 只会在任何虚拟内存中加载这两个库,而且我不知道强制特定内存位置的方法。
请问您有任何适用的解决方案吗?
如果这没有价值,是否可以找到动态 linker 在 运行 二进制文件中加载两个“usrdata”部分的内存位置?如果是这样,这对我来说就足够了,因为我还可以更改内部 C 代码中的一些内存引用以使其工作。
提前致谢
some of these libraries (2 of them, let call libdata1.a and libdata2.a) are just a collection of initialized structs.
However now, I need a solution to load these two libs (or the data section that they embed) in a dynamic fashion.
最简单的解决方案是将原始初始化结构保存到一个文件中(file1.data
、file2.data
),并mmap()
将它们保存在您需要的地址并带有MAP_FIXED
标志.
在这项工作中涉及动态加载程序是 counter-productive -- 你将与之抗争。
is it possible to find the memory location where the two "usrdata" sections were loaded in the running binary by the dynamic linker ?
使用 dladdr.
这很容易做到
我正在寻找一种方法 relocate/load 共享库的用户定义数据部分到 C 程序的特定虚拟内存。
最初,我只使用静态库 (.a) 来 link 整个程序。其中一些库(其中 2 个,我们调用 libdata1.a 和 libdata2.a)只是初始化结构的集合。一种“基于C的数据库文件”。
出于某些兼容性原因,这些库的“数据部分”需要加载到最终程序中的特定内存位置。
在静态情况下,我只是修改了 ld 脚本以添加一个规则来实现它,并且一切正常。
.usrdata1 0x04200000 : { *(.usrdata1 ) } /* data1 is the renamed data section of libdata1 */
.usrdata2 0x04300000 : { *(.usrdata2 ) } /* data2 is the renamed data section of libdata2 */
但是现在,我需要一个解决方案来以动态方式加载这两个库(或它们嵌入的数据部分)。所以库将与最终的二进制文件分离。我考虑过使用共享库 (.so),但是动态 linker 只会在任何虚拟内存中加载这两个库,而且我不知道强制特定内存位置的方法。
请问您有任何适用的解决方案吗?
如果这没有价值,是否可以找到动态 linker 在 运行 二进制文件中加载两个“usrdata”部分的内存位置?如果是这样,这对我来说就足够了,因为我还可以更改内部 C 代码中的一些内存引用以使其工作。
提前致谢
some of these libraries (2 of them, let call libdata1.a and libdata2.a) are just a collection of initialized structs.
However now, I need a solution to load these two libs (or the data section that they embed) in a dynamic fashion.
最简单的解决方案是将原始初始化结构保存到一个文件中(file1.data
、file2.data
),并mmap()
将它们保存在您需要的地址并带有MAP_FIXED
标志.
在这项工作中涉及动态加载程序是 counter-productive -- 你将与之抗争。
is it possible to find the memory location where the two "usrdata" sections were loaded in the running binary by the dynamic linker ?
使用 dladdr.
这很容易做到