2015-04-29 62 views
2

我有一个在共享内存区域中声明符号的遗留系统。使用gcc的链接器命令脚本函数将这些地址静态地定义到内存中的绝对地址。我可以在C中构建一个静态测试可执行文件,它在编译期间传递静态对象文件和链接器命令脚本并正确连接到共享内存区域(shmat()等)时正确引用了这些符号。在共享库中解析静态定义的符号

我想要做的是建立一个Python扩展库,它可以访问相同的符号。能够从Python访问库需要我所了解的-shared-fPIC选项。当我这样编译时,符号不再位于正确的地址。用-shared -fPIC编译C测试程序也会导致地址错误。 我可以直接在扩展库中定义的符号:

int *pA = 0x030A0000; 

和这个作品使用-shared -fPIC编译时。但我应该吗?我需要的符号有数百个,如果地址有变化,它将不可维护。好像应该有一种方法来指示,这些符号不应该搬迁的链接,但没有我triedworked,包括如下编译:

在代码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 
+0

'PIC'代表'位置独立代码',并向链接器指示它可以从库中获取函数并将其放置在内存代码部分的任何位置。我可能不像其他人那样迅速,但除了你在做什么之外,我没有真正的解决方案。 – jiveturkey

+0

是的,我阅读手册页中关于国旗的描述,并提出了一些警告标志。但是,我正在使用distutils来构建Python模块并自动插入标志。我的假设是模块需要正确使用Python,但我会做一些调查。 –

回答

0

研究和各种标志(--just-symbols-Bsymbolic--dynamic-list多次试验后,--defsym等),并在theseanswers和objdump和一些printf的帮助下,我发现共享对象索引它们的符号的方式阻止了我所要做的结果。将所需的Python扩展作为共享对象进行编译并不需要手动设置指向所有需要的符号的指针。

我能做的就是添加与我写入内置Python模块相同的模块代码。在那里用我的自定义模块重新编译Python,并链接到我已经拥有的静态对象文件和链接器命令脚本(已添加到模块/设置文件:my_module my_module.c -I/include/path -Xlinker /path/static_object.o /path/linker_script.ld),允许所有符号解析为正确的地址。 Python源代码中的文档足以向我展示如何执行此操作。