程序员的自我修养

四大神器,解决依赖:

ldd是用来查看执行文件或.a,.so的依赖关系利器(从链接的角度)。
nm———————查看静态符号表,观察依赖关系
-sD *.so
objdump -p t_sql.o | grep NEEDED

库命令:
file *.o—————看ELF信息
objdump -[看列表] *.o——看目标文件的结构和内容
基本信息(-h)
更多信息(-x)
依赖信息(-p)objdump -p t_sql.o | grep NEEDED

动态链接的可执行文件中包括got,有时有调用别模块时的共享对象也存在此段。

查看一个so是否PIC(地址无关性)编译的:
readelf -d .so | grep TEXTREL
如果有输出,用的是装载时重定位(虽多进程调用可以,但牺牲了效率),否则,证明编译时加了-fPIC,是地址无关。

readelf—————-看elf详细信息,包括(系统位,大小端,是否可执行)
文件头信息(-h)
详细的信息(-S)较权威的段表信息
从linker角度来查看链接器使用的dynamic段的信息(-d *.so)链接库的elf信息,同于ldd(宏观模块体现)。
-sD *.so查看动态符号表(从库提供服务或使用的角度),针对段.dynsym观察依赖关系
-l ../bin/devcomm | grep interpreter(链接器使用的段)查看生成它的链接器(可执行文件)
-r *.so查看重定向符号表

链接的秘密:

目标文件静态重定向—动态链接文件重定向——可执行动态链接文件重定向
rel.text——————rel.dyn———–针对数据引用,修正位于数据段中的got(全局变量的引用地址)
rel.data——————rel.plt————针对函数引用,修正got.plt

全局符号表

二元信号量:

信号量(多元):

互斥量:不同于二元信号量:哪线程存得,哪线程释放
相同二元信号量:都是约束线程排队的

临界区:在一点处与互斥量不同:其它进程不可见。(和内核对象名称不太相符)

条件变量:同时阻塞和唤醒多个线程