(待整理)

一.函数库链接的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后,系统函数被自己的取代,不管是在自己还是系统调用中<C专家编程>读书笔记

准则:不要让程序中的任何符号成为全局的,除非有意把它们作为程序的接口之一

在ld程序中使用-m选项,让连接器产生一个报告,里面包含了被interpose的符号说明.

三.运行时数据结构

  1.a,out:assembler output(汇编程序输出)缩写,汇编程序和链接编辑输出格式(老式BSD文档),链接器输出.

  2.运行时数据结构:堆栈,活动记录,数据,堆

  1)堆栈:为临时,局部变量分配空间;函数调用时保护现场;用作暂时存储区;

  2)过程活动记录:函数调用时用来保护现场的数据结构,存放于寄存器中时效率更高,相关函数setjmp()和longjmp(),类似catch/throw;

  3.关于多线程,为每个线程分配不同的堆栈,提高处理性能

<C专家编程>读书笔记

相关文章: