- 论坛徽章:
- 0
|
本帖最后由 landker 于 2013-09-29 19:09 编辑
请教一下动态链接的问题,如下:- 对于以下代码:
- //--------------------------------
- // test.c
- void main()
- {
- abc();
- }
- //--------------------------------
- //--------------------------------
- // share_lib.c
- void abc()
- {
- printf("hello world!\n");
- }
- //--------------------------------
复制代码 1)编译:
gcc -c test.c -o test.o
gcc -shared -o share_lib.so share_lib.c
2)链接
ld -o test_exe test.o share_lib.so
3)执行
./test_exe
对于3)的执行,简述如下:
4)扫描test_exe的信息头,如果发现 .interp 段且有内容,则按照动态链接处理;否则,按静态链接处理(entry入口)。
5)如果按照动态链接处理,则将 .interp 的内容(lib/ld-linux.so.2,即动态链接器)加载至内存(假设之前没有被加载过)
6)接着,系统将处理权交给“动态链接器”(lib/ld-linux.so.2),由它对 test_exe 中的代码段、数据段的相关内容进行重定位(这里不考虑“位置无关”,即不存在.got)
7)最后,动态链接器将控制器交还给系统,由系统跳转至 6)得到的“入口地址”。
问题:
1、整个动态链接的过程(大体上)是这样吗?
2、对于2),test.o里应该是没有 .interp, .dynamic 等段表的,但 test_exe 有。那么,这个链接过程是否也叫做“动态链接”(我感觉 4)~ 6) 这3步才叫做“动态链接”)?
|
|