另一个偏移是0x26的指令的一条调用,它其实就是表示对swap函数的调用,如4-5所示:
这条指令共5个字节,前面的0xE8是操作码(intel从IA-32手册可以查阅到),这条指令是一条近址相对位移调用指令...链接器就会发现 shared和swap两个符号没有被定义,没有办法完成链接工作:
这也是我们平时在编写程序的时候最常碰到的问题之一,就是链接时符号未定义。...通过前面指令重定位的介绍,我们可以更加深层次地理解为什么缺少符号的定义会导致链接错误。其实重定位过程也伴随着符号的解析过程,每个目标文件都可能定义一些符号也可能引用到定义在其他目标文件的符号。...比如我们查看“a.o”的符号表:
GLOBAL”类型的符号,除了“main”函数是定义在代码段之外,其他两个“ shared和“swap”都是“UND”,即“ undefined”未定义类型,这种未定义的符号都是因为该目标文件中有关于它们的重定位项...所以在链接器扫描完所有的输入目标文件之后,所有这些未定义的符号都应该能够在全局符号表中找到,否则链接器就报符号未定义错误。