我有一个遗留系统,它在共享内存区域中声明符号。使用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