当前位置: 首页 > 面试题库 >

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

杜轩昂
2023-03-14
问题内容

据我所知,x86汇编代码在很大程度上受寄存器数量的限制。

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

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

我认为加载SO文件或DLL文件所需的时间,以及用于保持不同位置重定位的.so文件所需的内存量,并不比始终缺少整个寄存器要糟糕。
GOT并具有所有这些间接跳转。

我也完全不在乎ALSR等。对于我所想到的应用程序,我只是在乎库中的代码要尽可能地优化

1)为什么Linux不支持Windows这样的动态库加载,而动态库加载会产生更多性能代码?

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

2)我可以在Linux上创建NOT -fPIC编译的SO文件吗?我可以离开-
fPIC吗?是否有任何方法,手册或项目适用于该主题,并且可以避免浪费整个寄存器并仍然动态加载库?

如果仅在编译.so文件时放下-fPIC,会发生什么情况?


问题答案:

如果仅-fPIC在编译.so-file 时放下,会发生什么?

生成的共享库ELF文件(很有可能)将以半随机(即,不可预测的)页面地址动态加载(例如,因为mmapsyscall会遇到ASLR)。

链接器将产生大量的重定位操作。因此,动态链接程序(ld.so)必须缓慢处理大量重定位,因此必须重写您的文本段(并且不会与使用同一.so文件的其他进程有效地只读共享)。

因此,实际上-fPIC,即使有可能,忘记共享对象(即,动态链接库)上的链接通常也是一个坏主意。

阅读Drepper的HowTo做动态共享库的文章和Wheeler的程序库Howto

顺便说一句,与x86-64相比,在x86(32位)上与位置无关的代码成本更高。但是值得付出努力(在x86 32位上,PIC代码可能比非PIC慢5至10%)。



 类似资料:
  • 问题内容: 我最近正在构建针对x86-64架构的特定共享库(ELF),如下所示: 失败并显示以下错误: 创建共享库时,不能使用针对“本地符号”的R_X86_64_32重定位;用-fPIC重新编译 当然,这意味着我需要将其重建为位置无关的代码,因此适合链接到共享库。 但这在具有完全相同的构建参数的x86上效果很好。所以问题是,x86上的重定位与x86-64有何不同?为什么我不需要在前一个上进行编译?

  • 问题内容: 我有4个文件: 1.C , 升·小时 , 2.C , 2.H 。我需要一个makefile,它将从这4个文件中创建一个动态库(.so)。我试图写一个像这样的makefile文件: library.so:1.c 1.h 2.c 2.h 但它没有用。如果有人帮助我,太好了,谢谢。 问题答案: 就像是 但这未经测试!我假设Linux使用GNU make ,并且目录仅包含您的库的源代码(带有上

  • 我们知道有各种各样的应用程序,比如假冒我的GPS等等。但是这些应用程序使用开发者选项来激活模拟位置。检测模拟位置的应用程序通常会检查权限是否打开,并使用以下代码: 使用权限android: name="android.permission.ACCESS_MOCK_LOCATION"/ 我想知道是否有一种方法可以欺骗(更改)位置,而无需更改设备根目录或在Android上激活模拟位置设置。

  • 我们的hadoop集群使用kerberos,所以我们需要先使用kinit,然后使用类似“hadoop fs-ls/”的命令。现在我使用jaas和gssapi登录并在集群中创建文件,但失败了。这是我的代码: 贾斯。具体如下: 我的登录用户名是root,在使用“hadoop jar./client.jar”之前运行此代码,我运行kdestory删除kerberos缓存,然后我得到以下错误: 我不知道如

  • 问题内容: 我最近浏览了CSS文件,并将所有6位十六进制代码都切换为简单的3位代码(例如,我缩写为)。它呈现的颜色几乎与以前完全相同,在我看来,各部分之间的用处不大,将它们删除可以节省我CSS文件中的整个300个字节。 使用哪个版本有关系吗?我很少碰到只使用3位数代码的网站(或者我猜我从来没有碰过使用3码代码的网站)。使用3位代码而不是6位代码还是完全有效,还是我们应该使用完整的6位代码? 问题答

  • 问题内容: 确实有两个问题: 是否有关于配置文件放置位置的标准/约定? 对于系统程序或准系统程序,它们似乎通常位于中。对于普通的应用程序或特权不足的程序,似乎不太清楚。 在处理程序选项时,有优先的标准层次结构吗?例如,命令行选项是否覆盖初始化文件和/或环境变量?反之亦然?还是这完全取决于开发人员? 问题答案: 通常,系统/全局配置存储在/ etc下的某个位置。 用户特定的配置存储在用户的主目录中,