我有一个在共享内存区域声明符号的遗留系统的地址使用gcc的链接器命令脚本函数静态地定义为内存中的绝对地址我可以用C构建一个静态测试可执行文件,当我在编译过程中传递静态对象文件和链接器命令脚本时,它会正确地引用这些符号,并附加到共享内存区域(shmat()等)。
我要做的是构建一个Python扩展库,它可以访问相同的符号要从Python访问库,需要我所理解的-shared-fPIC选项当我这样编译时,符号不再位于正确的地址用-shared -fPIC编译C测试程序也会导致地址错误。
我可以直接在扩展库中定义符号:

int *pA = 0x030A0000;

当使用-shared -fPIC编译时,这是有效的但我应该吗我需要几百个符号,如果地址改变了,那就无法维护了似乎应该有一种方法向链接器指示这些符号不应重新定位,但我没有tried的符号有worked的符号,包括编译如下:
在Python扩展的代码中:
extern int symbol_i_need;
...
printf("%d", symbol_i_need); // Seg fault

编译命令:
gcc -fPIC -o my_module.o my_module.c /path/static_object.o /path/linker_command_script.ld
gcc -shared -fPIC -o my_module.so my_module.o -Wl,-Bstatic,/path/static_defined_object.o,/path/linker_command_script.ld,-Bdynamic -rdynamic

最佳答案

经过对各种标志(--just-symbols-Bsymbolic--dynamic-list--defsymmy_module my_module.c -I/include/path -Xlinker /path/static_object.o /path/linker_script.ld等)的研究和大量实验,并借助于theseanswers和objdump以及一些printf,我发现共享对象索引其符号的方式阻止了我要得到的结果如果不手动设置指向所需符号的指针,将所需的Python扩展编译为共享对象是不可行的。
我所能做的就是将我编写的模块代码添加到内置的Python模块中用我的自定义模块重新编译Python,并与我已经拥有的静态对象文件和链接器命令脚本(添加到Modules/Setup文件中:)进行链接,从而允许所有符号解析为它们的正确地址Python源代码中的文档足以说明如何做到这一点。

07-24 09:44
查看更多