- 主题:关于动态库加载的一些疑问
动态库的代码都是位置无关的吗?
是什么程序负责加载动态库(mmap)的,内核还是应用加载器?
应用程序怎么知道动态库的地址的?这个地址是连接是确定,还是加载时确定?
--
FROM 45.78.4.*
【 在 wjhtingerx 的大作中提到: 】
: 动态库的代码都是位置无关的吗?
是的
: 是什么程序负责加载动态库(mmap)的,内核还是应用加载器?
你对加载的准确定义?
: 应用程序怎么知道动态库的地址的?这个地址是连接是确定,还是加载时确定?
一般情况下应用程序是通过函数调用 foo@PLT 这样的方式来使用动态库的
linker的时候不可能知道地址的
只有运行时动态库装入内存之后被调用的函数地址才能确定,这时loader才能把真正的地址填入到PLT中
: ...................
--
FROM 104.133.8.*
谢谢。
动态库,.so文件不是通过mmap映射到某个内存中的吗,我是问这个过程是loader在应用中调用mmap做,还是内核直接做了。
你的意思,foo@PLT这个PLT是TEXT代码段的一部分,动态库地址映射好后,loader再去修改每个PLT地址?
【 在 BigCarrot 的大作中提到: 】
: 是的
: 你对加载的准确定义?
: 一般情况下应用程序是通过函数调用 foo@PLT 这样的方式来使用动态库的
: ...................
--
FROM 45.78.4.*
【 在 wjhtingerx 的大作中提到: 】
: 谢谢。
: 动态库,.so文件不是通过mmap映射到某个内存中的吗,我是问这个过程是loader在应用中调用mmap做,还是内核直接做了。
把文件映射到内存中当然是要内核做了
: 你的意思,foo@PLT这个PLT是TEXT代码段的一部分,动态库地址映射好后,loader再去修改每个PLT地址?
loader的作用不就是计算各种地址,填写各种表吗
你以为loader是干什么的?
: ...................
--
FROM 104.133.8.*
但是有些系统出于安全的考虑,TXT内存区是设为只读的,这种怎么搞的?
另外,loader功能是包含在在exec这类函数里面,还是单独的应用程序?
【 在 BigCarrot 的大作中提到: 】
: 把文件映射到内存中当然是要内核做了
: loader的作用不就是计算各种地址,填写各种表吗
: 你以为loader是干什么的?
: ...................
--
修改:wjhtingerx FROM 45.78.4.*
FROM 45.78.4.*
【 在 wjhtingerx 的大作中提到: 】
: 但是有些系统出于安全的考虑,TXT内存区是设为只读的,这种怎么搞的?
把plt放数据段,函数调用的时候先把地址读到寄存器中再跳过去
: 另外,loader功能是包含在在exec这类函数里面,还是单独的应用程序?
一般是单独的把
--
FROM 104.133.8.*
动态连接库的加载是由ld.so负责的。
它会把需要的动态库文件mmap到内存。从而得到动态库的地址。
【 在 wjhtingerx 的大作中提到: 】
: 动态库的代码都是位置无关的吗?
: 是什么程序负责加载动态库(mmap)的,内核还是应用加载器?
: 应用程序怎么知道动态库的地址的?这个地址是连接是确定,还是加载时确定?
: ...................
--
FROM 111.193.205.*