计算机编程:Linker 链接器

2020-11-19  本文已影响0人  云淡风清漫步游

Linker是干啥的?应用的场景和解决的问题有哪些?能带来什么好处?

Linker的出现,主要是针对复杂软件,多个文件,灵活的修改开发,只修改其中部分,然后再link为可执行文件的,而无需编译整个程序。

更高级的应用场景是shared library和dynamic loading,共享链接库和动态加载扩展和重新定义函数或应用行为。

功能1 静态链接:Linker把多个目标文件链接成一个可执行文件,主要是负责:变量和函数名等 Symbol的解析和处理,Relocation 程序和函数的入口。

功能2 动态链接:很多系统函数比如 printf(),跑在电脑上的很多程序都要使用,所以系统尽量只存一份,而不是静态链接到每个可执行程序里去,运行时 共享动态链接库的 .text段,在memory里仅需一份,这样节省系统资源。

PIC (position independent code):

数据段通过与代码段之间的相对位置固定,可以通过PC的间接寻址方式确定,并构建一个Global Offset Table (GOT),做到数据的地址与内存中的绝对地址无关。

利用GOT和Procedure Linkage Table (PLT), 动态链接器在 函数被调用时,修改GOT对应的entry,完成shared librar函数的调用。

If you are using the C++ library across dynamically-loaded objects, make certain that you are passing the correct options when compiling and linking:

Compile your library components:

g++ -fPIC -c a.cc

g++ -fPIC -c b.cc

...

g++ -fPIC -c z.cc

Create your library:

g++ -fPIC -shared -rdynamic -o libfoo.so a.o b.o ... z.o

Link the executable:

g++ -fPIC -rdynamic -o foo ... -L. -lfoo -ldl

上一篇下一篇

猜你喜欢

热点阅读