BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #29087同步于 2009/9/25
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

编译的时候,是不是所有函数的地址都是确定了的?

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