在Linux上创建.SO文件而不使用PIC(位置无关代码)(x86 32位)

时间:2013-07-27 17:16:21

标签: linux assembly dll dynamic-linking relocation

据我所知,x86汇编代码受到有限数量寄存器的限制。

当我在Linux上了解到要创建.so文件时,必须为gcc指定-fPIC命令行参数才能创建与位置无关的代码,我无法首先相信它。

据我所知,elf文件格式支持重定位,就像 - 在我看来更好 - Windows DLL系统工作原理:在Windows上,链接器重新定位DLL中的所有偏移量,如果有必要的话。

我认为加载SO文件或DLL文件所需的时间,以及用于保存不同重定位的.so文件的内存量并不像缺少整个寄存器一样糟糕它指向GOT并具有所有这些间接跳跃。

对于我想到的应用程序,我也根本不关心ALSR等。我只关心在库中尽可能地优化代码。

1)为什么Linux不支持更像Windows的动态库加载,这应该可以生成更高性能的代码?

到目前为止,我找不到真正的解释。只是在某些事情上,重新定位代码会非常糟糕和缓慢(当然,对于在桌面计算机上加载文字处理器,重要的是加载速度,我完全接受。但是对于计算密集型服务器进程(不处理来自互联网的恶意数据),我想拥有我能得到的所有性能和寄存器!

2)我可以在Linux上创建NOT -fPIC编译的SO文件吗?我可以离开-fPIC吗?是否有关于此主题的howto,manual或project,并且可以不浪费整个寄存器并仍然动态加载库?

如果我在编译.so文件时删除-fPIC会发生什么?

0 个答案:

没有答案