(待整理)
一.函数库链接的5个秘密:
1.编译器会用-Lpathname来指定动态链接库的位置,以gcc为例,
gcc test.c -o test -lmyBaic -L ./code/libs
该语句链接./code/libs下的libmyBasic.so,生成可执行文件test.
另外也可以指定环境变量,用来指定编译时查找动态库的位置,为LD_LIBRARY_PATH和LD_RUNPATH.
2.库约定
预处理命令#include<头文件>,有些约定了头文件的查找路径(自动链接),而有些会需要动态链接.
以Solaris 2.x为例:
自动链接: <stdio.h> /usr/lib/libc.so
动态链接: <thread.h> -lthread
3.静态库与动态库的动作(链接语义)不同
当程序在scanf()和printf()中使用浮点数格式,但并不调用任何其他浮点数函数时,就有可能猜测错误.
二. interpositioning, 重写库函数
interposion和缺省全局域:使用interpositoning后,系统函数被自己的取代,不管是在自己还是系统调用中
准则:不要让程序中的任何符号成为全局的,除非有意把它们作为程序的接口之一
在ld程序中使用-m选项,让连接器产生一个报告,里面包含了被interpose的符号说明.
三.运行时数据结构
1.a,out:assembler output(汇编程序输出)缩写,汇编程序和链接编辑输出格式(老式BSD文档),链接器输出.
2.运行时数据结构:堆栈,活动记录,数据,堆
1)堆栈:为临时,局部变量分配空间;函数调用时保护现场;用作暂时存储区;
2)过程活动记录:函数调用时用来保护现场的数据结构,存放于寄存器中时效率更高,相关函数setjmp()和longjmp(),类似catch/throw;
3.关于多线程,为每个线程分配不同的堆栈,提高处理性能