我有一个在共享内存区域中声明符号的遗留系统。使用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
'PIC'代表'位置独立代码',并向链接器指示它可以从库中获取函数并将其放置在内存代码部分的任何位置。我可能不像其他人那样迅速,但除了你在做什么之外,我没有真正的解决方案。 – jiveturkey
是的,我阅读手册页中关于国旗的描述,并提出了一些警告标志。但是,我正在使用distutils来构建Python模块并自动插入标志。我的假设是模块需要正确使用Python,但我会做一些调查。 –