返回信息流如果是确定的,那么这个地址是个什么地址(没有运行,就没有加载到内存中,就不是内存中的地址吧)?那运行的时候是如何与这个地址对应,并找到它们的呢?
这是一条镜像帖。来源:北邮人论坛 / cpp / #29087同步于 2009/9/25
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
编译的时候,是不是所有函数的地址都是确定了的?
never115
2009/9/25镜像同步14 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
三个步骤,预处理、编译、链接
编译的时候全局变量和函数的调用都是以符号表存在的,最后在连接的时候确定最终的地址。
其实你要问的不是这个问题,你要问的是最终可执行文件的函数、全局变量地址是如何确定的。这涉及到Loader原理了。如果是exe加载,则函数、全局变量地址都是在链接的时候就确定;如果是dll动态库加载,则连接时候的地址是无效的,需要重地位,可执行文件内部含有重定位信息的。
手酸了,就这么多了。。。
编译原理基本上忘光光了
【 在 never115 (竹马) 的大作中提到: 】
: 如果是确定的,那么这个地址是个什么地址(没有运行,就没有加载到内存中,就不是内存中的地址吧)?那运行的时候是如何与这个地址对应,并找到它们的呢?
全局变量应该地址是固定的,不管是dll还是exe,只是有无重定位节之分。
函数,除了导入表的,自己内部定义的,只考虑C不考虑C++面向对象的话,
多是以偏移的形式出现。
【 在 jmpesp (我是垃圾) 的大作中提到: 】
: 三个步骤,预处理、编译、链接
: 编译的时候全局变量和函数的调用都是以符号表存在的,最后在连接的时候确定最终的地址。
: 其实你要问的不是这个问题,你要问的是最终可执行文件的函数、全局变量地址是如何确定的。这涉及到Loader原理了。如果是exe加载,则函数、全局变量地址都是在链接的时候就确定;如果是dll动态库加载,则连接时候的地址是无效的,需要重地位,可执行文件内部含有重定位信
: ...................
【 在 flyingkisser 的大作中提到: 】
: 全局变量应该地址是固定的,不管是dll还是exe,只是有无重定位节之分。
: 函数,除了导入表的,自己内部定义的,只考虑C不考虑C++面向对象的话,
: 多是以偏移的形式出现。
没错,全局变量地址是固定,但是在dll加载的时候需要对引用该全局变量的指令进行重定位信息。
至于函数的调用,基本上以call+偏移量的指令编码形式出现。
但是对C++的虚函数调用则是建立一个虚函数表,然后用用绝对地址调用的,所以需要重定位了。这些情况太多了,没法说详细。
你我说的并不矛盾.
C++类成员函数,应该不是以绝对地址调用。也完全没有必要。
我逆向分析过的C++ bin,很多是call dword ptr [ecx+38h]类似这样出现的。
【 在 jmpesp (我是垃圾) 的大作中提到: 】
: 没错,全局变量地址是固定,但是在dll加载的时候需要对引用该全局变量的指令进行重定位信息。
: 至于函数的调用,基本上以call+偏移量的指令编码形式出现。
: 但是对C++的虚函数调用则是建立一个虚函数表,然后用用绝对地址调用的,所以需要重定位了。这些情况太多了,没法说详细。
: ...................
多谢多谢!
如果是链接的时候就确定了,比如一个函数的地址是0X12345678,这个地址是指的是什么地址呢?它运行时应该在内存中出现的地址?如果这时候0X12345678被别的程序占用怎么办?还是说有什么映射关系?
另外,本人不是计算机专业,相关知识应该看什么书呢?
【 在 jmpesp 的大作中提到: 】
如果是exe加载,则函数、全局变量地址都是在链接的时候就确定;如果是dll动态库加载,则连接时候的地址是无效的,需要重地位,可执行文件内部含有重定位信息的。