[/codesyntax]flag字段 section的flag字段分为两个部分,一个是区域类型(section type),一个是区域属性(section attributes)。其中type是互斥的,即只能有一个类型,而attributes不是互斥的,可以有多个属性。如果段(segment)中的任何一个section拥有属性S_ATTR_DEBUG,那么该段所有的section都必须拥有这个属性。具体的flag字段内容以及意义请参考/usr/include/mach-o/loader.h。
段名(segname)和区域名(sectname)本身没有意义。但是为了支持传统的UNIX系统所以使用了一些传统意义上的段名和区域名称,比如TEXT段,DATA段。
下面是__TEXT段的部分截取:
Load command 1
cmd LC_SEGMENT
cmdsize 464
segname __TEXT
vmaddr 000001000
vmsize 000002000
fileoff 0
filesize 8192
maxprot 000000007
initprot 000000005
nsects 6
flags 00
Section
sectname __text
segname __TEXT
addr 0x00001b50
size 0x000008f6
offset 2896
align 2^4 (16)
reloff 0
nreloc 0
flags 080000400
reserved1 0
reserved2 0
Cmd为LC_SEGMENT,所以前面是segment_command结构体,紧跟着就是当前段所拥有的section,这里之截取了一个section
__TEXT段的__text section,参考section的定义,可以很清除的明白个字段的意义。
Load command中根据类型(即cmd字段)的不同,分别定义了相关的结构体,具体请参详/usr/include/mach-o/loader.h。
5. 段(segment和section)
段的命名规则是两个下划线紧跟着大写字母(如__TEXT),而section的命名则是两个下划线紧跟着小写字母(__text)。
下面列出段中可能包含的section:
__TEXT段:
__text, __cstring, __picsymbol_stub, __symbol_stub, __const, __litera14, __litera18;
__DATA段
__data, __la_symbol_ptr, __nl_symbol_ptr, __dyld, __const, __mod_init_func, __mod_term_func, __bss, __commom;
__IMPORT段
__jump_table, __pointers;
其中__TEXT段中的__text是实际上的代码部分;__DATA段的__data是实际的初始数据。otool
可以通过otool –s查看某segment的某个section。
例如 otool –sv __DATA __data ButtonFun,得到如下文件:
ButtonFun:
(__DATA,__data) section
00003648 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/tongxinshuyu/article-42605-4.html
不行
懂点哲学的小学生都知道世界上没有绝对的事
做过调查吗