我很困惑。我尝试在x86上的Linux。为什么从非pic对象创建的共享库可以工作?
1
A
回答
1
x86 ABI类型支持共享库中的非PIC代码。正如之前指出的那样,这意味着通常共享的页面将不会被共享(因为ld.so需要在代码而非特殊位置(GOT)修补引用)。
但是建立这种方式的库可能会快一点,因为PIC代码通常比较慢。
amd64 ABI不支持。
2
PIC只是使加载器更简单,因为它只需修改代码中的几个全局地址。非PIC代码只包含更多这些地址,因此需要重定位的地址表更大。但是,在任何一种情况下,加载器都必须能够重新定位代码(例如,解析静态/全局变量和全部函数指针的地址)。
相关问题
- 1. 在共享库中混合PIC和非PIC对象
- 2. GCC,PIE,PIC,档案和共享对象 - 什么适用于什么?
- 3. 从C++创建共享库
- 4. 可以从共享点URL工作WKWebView?
- 5. 为什么从引用中创建共享指针会复制对象?
- 6. 创建虚拟共享对象(.so),以依赖于其他共享对象
- 7. 如何从静态库创建共享对象文件
- 8. 什么是共享工作者?工人与共享工人有什么不同?
- 9. C++:创建一个共享的对象,而不是共享的对象指针
- 10. 创建为共享库而非可执行文件的新组件项目
- 11. 为什么不使用apply方法可以创建Map对象?
- 12. 什么是共享对象文件?
- 13. 共享对象库和MPI
- 14. 创建最小共享库
- 15. 创建Oozie共享库
- 16. 吉斯:创建共享库
- 17. 我可以向现有的共享对象添加库拒绝?
- 18. g ++在创建共享对象时无法链接库
- 19. 由工厂构建的对象的共享指针,可以不受欢迎
- 20. 共享库的ELF头为什么会指定Linux作为OSABI?
- 21. 如何为演员的商店对象创建共享列表?
- 22. 为什么SecurityContext的Authentication对象不能在线程间共享?
- 23. 为什么我的静态构建需要共享库?
- 24. 在C++中,其他两个不同的共享对象可以从第三个共享对象访问Singleton吗?
- 25. 从链接二进制创建共享对象
- 26. 从C代码创建共享对象R
- 27. C++共享库创建 - 与其他共享库链接
- 28. 使用另一个共享库创建共享库
- 29. Can Flyway可以与非托管数据库对象共存吗?
- 30. 使用Air App为移动设备创建共享对象
必须?通常这根本不起作用 – 2009-11-12 10:02:06
您总是会有一些符号可以通过它们的全局地址进行访问。这些地址必须始终重新定位。过去,这样的代码通常映射到一个固定的地址,但随着缓冲区溢出的出现,操作系统会将应用程序映射到不断变化的地址,从而使这些类型的攻击变得更加困难。 – 2009-11-12 11:20:45