动态库 地址无关代码PIC

Henryinferno 2016-10-11 10:10:28

为什么p3进来后程序就不能正常工作了?动态库不就是为了共享的吗?
链接:http://www.wowotech.net/basic_subject/pic.html

...全文
353 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
Henryinferno 2016-10-13
  • 打赏
  • 举报
回复
引用 9 楼 paschen的回复:
[quote=引用 2 楼 wsx199397 的回复:]
[quote=引用 1 楼 paschen的回复:]因为A、B 和 C、D 的代码有重叠部分,你的p3程序同一个地址上只能放一个,否则你的指针去取这个地址取到的是哪个动态库

那么p1,p2为什么能正常运行?比如说B和C有代码重叠p2要访问c,为什么p2不会访问已经加载到内存的B呢?[/quote]

B和C有重叠无所谓,P2只依赖C和D,不会去加载B[/quote] 谢谢指教。能不能看看我上面理解的对不对。如果对的话很多问题自然就解决了。
Henryinferno 2016-10-13
  • 打赏
  • 举报
回复
引用 10 楼 mLee79的回复:
PIC 代码就重定位项少一点, 加载起来方便点而已, M$Win 的DLL不是PIC代码, 不照样跑的好好的么... 各个进程地址空间是隔离的, 缺省指定的 DLL 基址被占用就换个地呗, 做下重定位就是了, 只是修改过后的页在不同进程间就不是共享的了... 在 x86 这种寄存器少的可怜还不能用ip做基址寄存器的破机器上, 生成 PIC代码时还得用本来就很少了的寄存器保存GOT表基址, 太浪费了些... 不过如果要手工写个 elf/pe loader 啥的, 用PIC代码倒是方便多了...
谢谢指教啊。但是能不能看看我上面理解的对不对呀
Henryinferno 2016-10-12
  • 打赏
  • 举报
回复
引用 1 楼 paschen的回复:
因为A、B 和 C、D 的代码有重叠部分,你的p3程序同一个地址上只能放一个,否则你的指针去取这个地址取到的是哪个动态库
那么p1,p2为什么能正常运行?比如说B和C有代码重叠p2要访问c,为什么p2不会访问已经加载到内存的B呢?
mLee79 2016-10-12
  • 打赏
  • 举报
回复
PIC 代码就重定位项少一点, 加载起来方便点而已, M$Win 的DLL不是PIC代码, 不照样跑的好好的么... 各个进程地址空间是隔离的, 缺省指定的 DLL 基址被占用就换个地呗, 做下重定位就是了, 只是修改过后的页在不同进程间就不是共享的了... 在 x86 这种寄存器少的可怜还不能用ip做基址寄存器的破机器上, 生成 PIC代码时还得用本来就很少了的寄存器保存GOT表基址, 太浪费了些... 不过如果要手工写个 elf/pe loader 啥的, 用PIC代码倒是方便多了...
paschen 2016-10-12
  • 打赏
  • 举报
回复
引用 2 楼 wsx199397 的回复:
[quote=引用 1 楼 paschen的回复:]因为A、B 和 C、D 的代码有重叠部分,你的p3程序同一个地址上只能放一个,否则你的指针去取这个地址取到的是哪个动态库

那么p1,p2为什么能正常运行?比如说B和C有代码重叠p2要访问c,为什么p2不会访问已经加载到内存的B呢?[/quote]

B和C有重叠无所谓,P2只依赖C和D,不会去加载B
赵4老师 2016-10-12
  • 打赏
  • 举报
回复
总而言之,汇编语言的功底不到一定程度,讨论这个问题都是在浪费时间。
Henryinferno 2016-10-12
  • 打赏
  • 举报
回复
引用 4 楼 zhao4zhong1 的回复:
The Intel 64 and IA-32 Architectures Software Developer's Manual
赵老师看看我这样理解的对不对哈。如果不采用PIC,那么共享模块的地址在编译期就确定了。这里的地址是虚拟地址。 假设B的虚拟地址是2-8,C的虚拟地址是4-10。对应p1来说访问地址5访问的是模块B而不是C是因为p1并没有用到模块C,所以C不会映射到进程p1的虚拟地址空间中,所以不会产生二义性。
Henryinferno 2016-10-12
  • 打赏
  • 举报
回复
引用 1 楼 paschen 的回复:
因为A、B 和 C、D 的代码有重叠部分,你的p3程序同一个地址上只能放一个,否则你的指针去取这个地址取到的是哪个动态库
版主看看我这样理解的对不对哈。如果不采用PIC,那么共享模块的地址在编译期就确定了。这里的地址是虚拟地址。 假设B的虚拟地址是2-8,C的虚拟地址是4-10。对应p1来说访问地址5访问的是模块B而不是C是因为p1并没有用到模块C,所以C不会映射到进程p1的虚拟地址空间中,所以不会产生二义性。
Henryinferno 2016-10-12
  • 打赏
  • 举报
回复
引用 4 楼 zhao4zhong1 的回复:
The Intel 64 and IA-32 Architectures Software Developer's Manual
赵老师能不能给个具体点的指点啊,最近就是在看编译链接装载部分。
赵4老师 2016-10-12
  • 打赏
  • 举报
回复
The Intel 64 and IA-32 Architectures Software Developer's Manual
赵4老师 2016-10-12
  • 打赏
  • 举报
回复
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……
paschen 2016-10-11
  • 打赏
  • 举报
回复
因为A、B 和 C、D 的代码有重叠部分,你的p3程序同一个地址上只能放一个,否则你的指针去取这个地址取到的是哪个动态库

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧