- 论坛徽章:
- 11
|
要说链接原理, 我是没学过正式理论, 但想来应该是这样的吧:
1。 似乎有个名词叫符号表, 编译时未解决的符号被标记
2。 链接程序会在其他编译单元寻找, 或so或dll中, so 通过 -lpthread等参数传递给linker以指示可以在哪里寻找符号, windows下通过 .lib文件指示
3. 如果寻找到了, 则链接成功, 将外部引用的符号填入可执行文件一个section中, (windows下), linux下不知道, 估计也差不多吧, 一并填入的包括所引用的函数在目标so, dll中的位置。
4。 程序运行时, 加载so, dll到用户空间, 而后根据so, dll加载的内存地址修改所引用函数的位置到其在内存中的位置, 似乎这一步叫什么重定位
然后, 就可以运行了
如果我的理解是正确的, 那么如果应用程序 a 直接调用了 b.so中的函数, 则其链接时, 所要解决的只是b.so 中的函数在b.so中的位置, 只要能够找到该信息, 就应该链接成功, 至于b.so调用了c.so 中的函数, 那不关a的事。
如果我的理解错了, 那请说出错在哪里。 而且请说出如果按照我以上的步骤进行链接, 有什么问题解决不了, 以致于所谓 linker 的工作原理,以及动态/静态链接的原理 明确规定要链接成功a, linker 必须找到 c.so |
|