免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2384 | 回复: 3
打印 上一主题 下一主题

为什么链接器本身是个ld.so文件? 那又由谁去把这个ld.so加载到进程空间呢? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-05-18 15:20 |只看该作者 |倒序浏览
10可用积分
今天在看<<C专家编程>>,里面P126显示一个调用了共享库的进程,内存映像的一个图。里面在高地址(堆栈的下方),是链接器。

我上网搜了一下,发现ld确实是一个动态库ld.so.

问题是,人不能提着头发把自己抓起来,对吧,那么ld.so怎么把自己加载到进程地址空间呢?
这个ld又是链接的工具,又是程序装载的工具,如何被调用的呢?

最佳答案

查看完整内容

以ELF格式的文件为例,动态可执行程序的程序头(program header)里有一个域PT_INTERP,其指定了解析器即动态链接器的路径和名字。$ readelf -l a.outProgram Headers: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align PHDR 0x000034 0x08048034 0x08048034 0x00100 0x00100 R E 0x4 INTERP 0x000134 0x08048134 0x08048134 0x00013 0x00013 R 0x1 [Requesting program int ...

论坛徽章:
2
摩羯座
日期:2013-10-10 14:29:04天蝎座
日期:2014-01-03 09:14:49
2 [报告]
发表于 2012-05-18 15:20 |只看该作者
以ELF格式的文件为例,动态可执行程序的程序头(program header)里有一个域PT_INTERP,其指定了解析器即动态链接器的路径和名字。

$ readelf -l a.out

Program Headers:
  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
  PHDR           0x000034 0x08048034 0x08048034 0x00100 0x00100 R E 0x4
  INTERP         0x000134 0x08048134 0x08048134 0x00013 0x00013 R   0x1
      [Requesting program interpreter: /lib/ld-linux.so.2]

在程序执行时,操作系统会先将解析器加载进来,创建映像,然后将控制转交给解析器,解析器再来加载可执行程序和动态库。

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
3 [报告]
发表于 2012-05-20 19:09 |只看该作者
this ld is not that one.

ld command: run at the compiling time. it is an application just as other one (you can call it linker yet), it link the parts of program up to a executable image. ( pick parts to one)

program loader/linker: it is a kernel component to load program, it "load" the program from disk image and "link" (relocating a disk image) to specified memory.
(the function of this "program" is mapping (*note mapping ,not linking*) a disk image to memory.

unfortunately, in chinese, we calling the both of above the same name "链接器", but they are actually not the same one.

论坛徽章:
0
4 [报告]
发表于 2012-06-09 19:41 |只看该作者
二楼解释的基本上是对的,不过可执行程序是由内核加载的,解释器只负责库的加载。对于静态链接的程序是没有加载解释器一说的,内核加载完后,会直接调到程序入口处执行。动态链接的,内核加载完后调到解释器的入口!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP