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
网友评论