概要
一、共享库版本
1、共享库兼容性:接口签名不变。
2、共享库版本命名:libname.so.x.y.z,主版本、次版本、发布版本。
3、SO-NAME:只有主版本号库名的软链。解决依赖及升级问题。同名SO-NAME必须保持兼容性。
二、符号版本
1、基于符号的版本机制:符号表中加次版本号。
2、Solaris中的符号版本机制:VERS_1.2
3、Linux中的符号版本:GLIBC_2.0 GLIBC_2.1.2
三、共享库系统路径
1、/lib:系统最关键和基础的共享库。
2、/usr/lib:开发时共享库。非一。
3、/usr/local/lib:第三方库。

- 阅读剩余部分 -

收到警报,统计的从库不同步。
上去看了一下MySQL执行的进程情况。
[code]
mysql> show processlist\G
...
*************************** 3. row ***************************
Id: 7
User: xxolap
Host: 127.0.0.1:40367
db: xxdb
Command: Killed
Time: 53479
State: query end
Info: delete from xxdb.table_big where
send_time < (unix_timestamp('2014-7-14')-3600*24*7)*1000
[/code]
发现有一个对大表的删除数据操作,被kill,这个操作执行了53479秒,已经十多个小时了。

- 阅读剩余部分 -

概要
1、动态链接起因:与静态链接的区别及好处:省磁盘,省内存,省cpu,独立更新。缺点:。。。
2、一个例子:多出来的文件映射,装载地址0。
3、地址无关代码:
1)固定装载地址。
2)装载时重定位。
3)地址无关代码,四种寻址模式:
1)内部函数:相对寻址。
2)内部数据:相对寻址。
3)外部数据:全局偏移表(指向变量的指针数组)。
4)外部调用:全局偏移表(目标函数地址),有优化空间。
4)共享模块的全局变量:GOT。
5)数据段地址无关性:重定位表。

- 阅读剩余部分 -

在x86_64的环境中,把《程序员的自我修养》第4.6.2节中的例子敲了一遍,始终无法编译通过。
源码
[code]
char* str = "OK!\n";

void print(){
asm("movl $4,%%edx \n\t"
"movl %0,%%ecx \n\t"
"movl $0,%%ebx \n\t"
"movl $4,%%eax \n\t"
"int $0x80 \n\t"
::"r"(str):"edx","rcx","ebx"
);
}

void exit(){
asm("movl $42,%ebx \n\t"
"movl $1,%eax \n\t"
"int $0x80 \n\t");
}

void nomain(){
print();
exit();
}
[/code]
编译的错误提示
[code]
tok.c: Assembler messages:
tok.c:5: Error: suffix or operands invalid for `mov'
[/code]

- 阅读剩余部分 -

一、进程虚拟地址空间
1、程序和进程的区别:程序是可执行文件,程序运行的过程,通过一个或多个进程来完成。程序是静态的物理文件,进程是运行时的过程。
2、虚拟地址空间(Virtual Address Space):由硬件平台的CPU位数决定。大小为2的cpu位数次方减去1。
3、Linux进程虚拟空间分布:操作系统(OS)高位1G,用户进程低位3G。
4、PAE(Physical Address Extension)物理地址扩展。物理地址由32位扩展到36位。类似于之前把16位的地址线扩展到20位。
5、AWE(Address Windowing Extensions)窗式地址扩展。有点像扇区的访问方式。
二、装载的方式
1)、覆盖装入。程序员自己写覆盖管理器,用于合理分配和释放内存。生成依赖树,不能跨树调用。
2)、页映射。虚拟存储机制的一部分,按各种淘汰算法换出内存,缺页时加载。
三、从操作系统角度看可执行文件的装载。
1)、进程的建立。创建VAS,与可执行文件映射,启动。
2)、页错误。缺页加载。

- 阅读剩余部分 -

一、Windows的二进制文件格式 PE/COFF
1、PE(Protable Executable):可在各版本的Windows平台上运行。实际上只支持x86的CPU。
2、PE/COFF:VC++编译的目标代码还是COFF格式,可执行文件是PE格式。
3、PE32+:只是把原先32位的字段变成了64位。
4、也是段的结构,段名只有提示作用,没有实际意义。
二、PE的前身--COFF
1、COFF跟ELF非常像,可以找到跟ELF的文件结构相对应的地方。映像头、段表、各段。
2、映像(Image):在装载时被映射到进程的虚拟空间,所以也被叫做映像文件(Image File)。
三、链接指示信息
1、.drectve(Directive)段,编译器希望告诉链接器该怎样链接这个目标文件。
四、调试信息
1、.debug开始的段,都包含调试信息。
2、.debug$S代表符号相关的调试信息段。.debug$P代表预编译头文件相关的调试信息段。.debug$T表示类型相关的调试信息。
五、大家都有符号表。
1、最后部分是COFF的符号表。
六、Windows下的ELF--PE
PE与COFF的区别:
0.1 开始部分不是COFF文件头,是DOS MZ可执行文件格式的文件头和桩代码。兼容DOS而做。
0.2 原COFF文件头中的IMAGE_FILE_HEADER作为PE文件头IMAGE_NT_HEADERS的一部分。
0.3 PE兼容MZ格式,扩展名相同,在DOS下运行仅输出提示信息。
1)、PE数据目录。用于保存装载所需要的数据结构(导入表、导出表、资源、重定位表)的位置和长度。