关于window下的程序运行机理

r11222 2010-08-15 07:12:56
去window区问, 一个下午没人回答,郁闷

还是回来我熟悉的c/c++区


问题如下:

window 下 一个exe文件,编译好后,它的重定位是不是已经完成了? 也就是说,在程序加载入内存运行的时候,它还需要重定位吗??

第二个问题 , 上面的问题换成是DLL呢。

高手来帮忙
...全文
153 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
redleaves 2010-08-16
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 r11222 的回复:]
程序每次执行时,是不是应该加载在固定的虚拟地址? 所以重定位是不是比DLL少发生??
因为一个程序可能动态调用多个DLL. DLL加载的地址可能冲突,所以很大机会需要重定位
上面说的对吗?
[/Quote]一般情况下,EXE每次加载的基地址都是指定的地址.但这个不是绝对的.
相较而言,DLL基地址重定位的可能性是要大一些(其实发生的也很少.另外,基地址是可以手工调整的,可以手工避免重定位的发生).
但加载过程中,映像(EXE/DLL...)中引用到的符号是每次都要进行重定位的.
shiweifu 2010-08-16
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 r11222 的回复:]

还有一些内部/外部符号要在运行时才被定位. 内部/外部符号具体有哪些例子?
[/Quote]


重定位是链接时完成的吧
外部。。LZ考虑下LoadLibrary的实现?

wjb_yd 2010-08-16
  • 打赏
  • 举报
回复
一般exe都不用重定位了,都能放到0x40000000上。
dll就很难了,一般都需要加载器在加载的时候重定位。
dll和exe差不多的。

建议lz看看《加密与解密》,那书有些章节挺不错的。
DayDayUpCQ 2010-08-15
  • 打赏
  • 举报
回复
学习一下。。
赵4老师 2010-08-15
  • 打赏
  • 举报
回复
《Windows核心编程》
《深入解析Windows操作系统-Windows Internals》
xiaopoy 2010-08-15
  • 打赏
  • 举报
回复
windows的重定位看有没有重定位表就知道。
通常的exe不会被重定位,因为exe总是最先被载入的模块,通常的它需要的base位置是400000不会被其他模块抢掉,所以不需要重定位。
dll需要重定位是当dll模块需要的base位置被谁提前占领了时,这时有重定位表的DLL就被loader重定位下需要处理的地址。
重定位表的格式可以找个PE格式说明文档看看
r11222 2010-08-15
  • 打赏
  • 举报
回复
程序每次执行时,是不是应该加载在固定的虚拟地址? 所以重定位是不是比DLL少发生??

因为一个程序可能动态调用多个DLL. DLL加载的地址可能冲突,所以很大机会需要重定位

上面说的对吗?
lovestefanie 2010-08-15
  • 打赏
  • 举报
回复
学习了
redleaves 2010-08-15
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 r11222 的回复:]EXE文件哪些需要在运行时重定位?? 能不能举个例子,[/Quote]情况有很多种.比如.放在数据段的内容在加载程序时.要通过符号表重定位到实际加载的地址.然后同步代码段里引用的地址.
或者默认加载地址被占用,代码/数据要转移到其它的位置.其中引用的符号有可能需要重定位.

>还有一些内部/外部符号要在运行时才被定位. 内部/外部符号具体有哪些例子?
我这里说的符号是针对可执行映像而言的.上面例子中,数据段中存放的符号实例就是要重定位的内部符号.而如果引用了DLL,DLL中导出的符号就是外部符号.
r11222 2010-08-15
  • 打赏
  • 举报
回复
还有一些内部/外部符号要在运行时才被定位. 内部/外部符号具体有哪些例子?
r11222 2010-08-15
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 redleaves 的回复:]
window 下 一个exe文件,编译好后,它的重定位是不是已经完成了?
不一定.通常只有一部分内部符号会在编译时重定位.还有一些内部/外部符号要在运行时才被定位.
当然,也是可以做出不用重定位的可执行程序的.但这种程序不能直接引用任何外部符号.

第二个问题 , 上面的问题换成是DLL呢。
DLL也是一样.除了加载的时机不同,DLL基本和EXE是完全一样的.
[/Quote]



EXE文件哪些需要在运行时重定位?? 能不能举个例子,
xy_zhang 2010-08-15
  • 打赏
  • 举报
回复
DLL有可能在运行时进行第二次重定位。因为DLLs的base address有可能相同。
redleaves 2010-08-15
  • 打赏
  • 举报
回复
window 下 一个exe文件,编译好后,它的重定位是不是已经完成了?
不一定.通常只有一部分内部符号会在编译时重定位.还有一些内部/外部符号要在运行时才被定位.
当然,也是可以做出不用重定位的可执行程序的.但这种程序不能直接引用任何外部符号.

第二个问题 , 上面的问题换成是DLL呢。
DLL也是一样.除了加载的时机不同,DLL基本和EXE是完全一样的.

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧