链接过程中关于数据段合并操作和访问
在链接多个.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) 也需要重定位, 这个表示字符串本身也需要重定位
那么结论很简单了,字符串的使用也是需要进行重定位的