2013-01-04 37 views
1

我们可以用ldd来确定的依赖,比如:在静态/动态链接的情况下,lib依赖如何写入ELF可执行文件的.dynamic部分?

[email protected]: ldd `which date` 
     linux-vdso.so.1 => (0x00007fff0f5fd000) 
     librt.so.1 => /lib64/librt.so.1 (0x00002b2f7ea50000) 
     libc.so.6 => /lib64/libc.so.6 (0x00002b2f7ec59000) 
     libpthread.so.0 => /lib64/libpthread.so.0 (0x00002b2f7efb1000) 
     /lib64/ld-linux-x86-64.so.2 (0x00002b2f7e832000) 

由于“日期”依赖“libc.so”,我认为在“libc.so”指出,“日期”调用一些功能,我们知道该ldd可以确定从可执行文件的.dynamic部分的“日期”的lib依赖,但我的问题是如何编译器/链接器知道应该写入.dynamic部分?更具体地讲:

  1. 如果“libc.so”静态与“日期”链接,则该函数的代码应该已经汇编成“日”,所以在这种情况下,“日期”不应该依赖于“libc.so”,在.dynamic部分中不应该有“libc.so”。

  2. 如果 “libc.so” 动态带 “日期” 相连,在这种情况下,我假定一些这样的代码:

手柄= dlopen的( “libc.so”,.. );

应该存在于“date”中以加载“libc.so”,并且“dlopen(”libc.so“)”应该是“date”依赖于“libc.so”的唯一线索,在这种情况下,编译器/链接器如何知道“日期”取决于“libc.so”?它解析所有的“dlopen”行来提取lib依赖吗?我不认为这是一个好方法,但是真的,这是真的吗?

或者编译器/链接器有其他方法来确定动态链接情况下的lib依赖?谢谢。

回答

0

.so文件中的内容比.dynamic部分更多。详细了解Executable and Linkable Format(ELF是.so文件和二进制可执行文件的格式)。

特别是ELF文件确实有标题,它们包含信息。使用objdump和/或readelf实用程序来探索它们。

不要忘记,在构建共享库时,可以将其与其他库链接。

1

如何编译器/连接知道要写进.dynamic节

  • 编译器不知道任何关于.dynamic部分
  • 链接知道是否要链接与libc.alibc.so。对于您正在链接的任何*.so [1],它将DT_NEEDED条目写入.dynamic部分。

我认为一些这样的代码:handle = dlopen("libc.so", ..);

也就是说不正确假设和误解你的一部分。 dlopen允许您使用不依赖于的库,直接使用(可能存在也可能不存在)。那你就直接依赖于(如libc.so)的库:

  • 不需要被dlopened(装载机将已经映射他们为你的程序启动前)和
  • 不是可选的(在加载器会失败,如果他们失踪)。

[1]链接器标记--as-needed使该声明仅部分为真。

相关问题