程序的加载与链接

链接过程中关于数据段合并操作和访问

2020-06-22  本文已影响0人  狼性刀锋

链接过程中关于数据段合并操作和访问

在链接多个.o文件的时候,第一件事事情要做的是合并相同的段,代码段合并,数据段合并。
所以一直有个疑问,合并之后如何能够正确访问数据段,因为合并之后很明显数段段的地址和代码段的地址都发生了改变,那么不管采用何种方式,最终都无法正确定位数据段。

先写个简单的Demo


#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface Beer : NSObject
- (void)log ;
@end

NS_ASSUME_NONNULL_END


#import "Beer.h"

@implementation Beer

- (void)log {
    NSLog(@"this is beer");
    NSLog(@"this is beer");
}

@end


#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface Water : NSObject
- (void)log;
@end

NS_ASSUME_NONNULL_END


#import "Water.h"

@implementation Water

- (void)log {
    NSLog(@"this water");
}


@end




使用MachOView查看一下:

发现 Relocations表中包含一下两个表:
(_TEXT,_text) 代码段重定位表,该表中表示引用的字符串是需要重定位的
(_DATA,_cfstring) 也需要重定位, 这个表示字符串本身也需要重定位

那么结论很简单了,字符串的使用也是需要进行重定位的

上一篇 下一篇

猜你喜欢

热点阅读