个人猜测一下,有可能在连接之前是在符号表中的偏移量。具体编译器怎么安排符号表就不明了。
--
无能者无所求,饱食而遨游,泛若不系之舟
blog: http://shell909090.com/blog/
twitter: http://twitter.com/shell909090
2011/5/27 Peng Liang <pengli...@gmail.com>:
>
>
> 2011/5/27 胡瀚森 <softra...@gmail.com>
我对linux的elf格式不是很熟悉,我比较熟悉windows的PE格式。在这种格式里面,有所谓“重定位”的问题。即在代码载入的时候,根据各种基地址计算出正确的引用地址,然后修改代码的特定位置,将正确的数值填回去。
我记得x86asm的指令中,e8是绝对地址调用,因此后面跟的应该是虚拟地址空间中的地址。十多年前的记忆了,不知道有没有记错。
哈哈,那我们说的应该是一回事。我只说e8是绝对地址调用,很明显0不可能是目标地址。
> --
> Best regards,
> Peng Liang
>
>
--
另外, 如果是 hello.c, 无论用 gcc 编译 反汇编, 还是用 mingw-gcc 编译 反汇编 这条指令都是 e8 00 00 00 00,
所以我想知道 为什么 C++ 会不一样, 这个 0 和 -4 到底起了什么作用呢?
因为使用的是相对PC的call指令,PC超前当前指令4个字节,重定位时计算得到的值需要和addend相加。
--
Thanx & Regards,
小溪同学