社区
C语言
帖子详情
关于window下的程序运行机理
r11222
2010-08-15 07:12:56
去window区问, 一个下午没人回答,郁闷
还是回来我熟悉的c/c++区
问题如下:
window 下 一个exe文件,编译好后,它的重定位是不是已经完成了? 也就是说,在程序加载入内存运行的时候,它还需要重定位吗??
第二个问题 , 上面的问题换成是DLL呢。
高手来帮忙
...全文
153
14
打赏
收藏
关于window下的程序运行机理
去window区问, 一个下午没人回答,郁闷 还是回来我熟悉的c/c++区 问题如下: window 下 一个exe文件,编译好后,它的重定位是不是已经完成了? 也就是说,在程序加载入内存运行的时候,它还需要重定位吗?? 第二个问题 , 上面的问题换成是DLL呢。 高手来帮忙
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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是完全一样的.
C语言
69,371
社区成员
243,080
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章