Mach-0符号表

ABI Mach-O

Mach-O(Mach Object) 是MacOS、iOS,iPadOS存储程序和库的文件格式。对应系统通过应用二进制接口(application binary interface,缩写ABI)来运行改格式的文件。
Mach-O格式用来替代BSD系统的a.out格式。Mach-O文件格式保存了在编译过程和链接过程中产生机器代码和数据。从而为静态链接和动态链接的代码提供了单一文件格式。
段之前始终是4096字节或者4KB的倍数,其中4096字节是最小大小。
现在短是16KB的倍数,在macOS_x86_64上是16k,在ios上是32k。
Symbol Table

通过两个load commands:

用来描述 Symbol Table 的大小和位置,以及其他元数据。

LC_SYMTAB
用来描述该文件的符号表。不论是静态链接器还是动态链接器在此文件时,都要使用该load command。调试器也可以使用该load command找到调试信息。
symtab_command

 定义LC_SYMTAB价值命令具体属性。在usr/include/mach-o/loader.h中定义:

nlist
定义符号的具体表示含义:
n_type
1字节通过,通过四位掩码保存数据:
1. N_STAB(0xe0):如果当前的n_type 包含这三位中任何一位,则该符号为(调试表符号stab)。在这种情况下,整个n_type整个字段将被解释为(stab value)。请参阅usr/include/mach-o/stab.h以获取有效的stab value。
2. N_PEXT(0x10):如果当前的n_type 包含此位。则将此符号标记为私有外部符号。(__private_extern__(visibility=hidden)) ,只在程序内可引用和访问。当前通过静态链接器链接的时候,不要将其转换成静态符号(可以通过 ld 的  -keep_private_externs 关闭静态链接器的这种行为 )。

3.N_TYPE(0x0e):如果当前的n_type 包含此位。则使用预先定义的符号类型。

4.N_EXT(0x01):如果当前的n_type 包含此位。则符号为外部符号.该符号在该文件的外部定义或者在该文件中定义,但可以在其他文件中使用。

N_TYPE
字段的值包含:
1. N_UNDF(0x0):该符号未定义。未定义符号是在当前模块中引用,但是被定义在其他模块中的符号。n_sect 字段设置为NO_SECT.
2. N_ABS(0x2):该符号是绝对符号。链接器不会更改绝对符号的值。n_sect字段设置为NO_SECT.
3. N_SECT(0xe) :该符号在n_sect中指定的段号中定义。
4.N_PBUD(0xc):该符号未定义,镜像使用该符号的预绑定值。n_sect 字段设置为NO_SECT.
5.N_INDR(0xa):该符号定义为与另一个符号相同。n_value字段是string table中的索引,用于指定另一个符号的名称。链接该符号时,此符号和另一个符号都具有相同的定义类型和值。
stab value 包括:

n_sect
整数,用来在指定编号的 section 中找到此符号;如果在该 image 的任何部分都找不到该符号,则为 NO_SECT。 根据 section 在LC_SEGMENT加载命令中出现的顺序,这些 section从1开始连续编号。
n_desc
16-bit 值,用来描述非调试符号。低三位使用 REFERENCE_TYPE:
1.REFERENCE_FLAG_UNDEFINED_NON_LAZY(0x0):该符号是外部非延迟(数据)符号的引用。
2. REFERENCE_FLAG_UNDEFINED_LAZY(0x1):该符号是外部延迟性符号(即对函数调用)的引用。
3. REFERENCE_FLAG_DEFINED(0x2):该符号在该模块中定义。
4. REFERENCE_FLAG_PRIVATE_DEFINED(0x3):该符号在该模块中定义,但是仅对该共享库中的模块可见。
5. REFERENCE_FLAG_PRIVATE_UNDEFINED_NON_LAZY(0x4):该符号在该文件的另一个模块中定义,是非延迟价值(数据)符号,并且仅对该共享库中的模块可见。
6. REFERENCE_FLAG_PRIVATE_UNDEFINED_LAZY(0x5):该符号在该文件的另一模块中定义,是延迟价值(函数)符号,仅对该共享库中的模块可见。
另外还可以设置如下标识位:
1. REFERENCED_DYNAMICALLY(0x10):定义的符号必须是使用动态加载器中 (例如 dlsym 和 NSLookupSymbolInImage)。而不是普通的未定义符号引用。 strip 使用该位来避免删除那些必须存在的符号(如果符号设置了该位,则 strip 不会剥离它)。
2. N_DESC_DISCARDED(0x20):在完全链接的 image 在运行时动态链接器有可能会使用此符号。不要在完全链接的 image 中设置此位。
3.N_NO_DEAD_STRIP(0x20):定义在可重定位目标文件(类型为 MH_OBJECT)中的符号设置时,指示静态链接器不对该符号进行 dead-strip。(请注意,与  N_DESC_DISCARDED(0x20)  用于两个不同的目的。)
4. N_WEAK_REF(0x40):表示此符号为弱定义符号。如果静态链接器或动态链接器为此符号找到另一个(非弱)定义,则弱定义将被忽略。只能将合并部分中的符号标记为弱定义。
如果该文件是两级命名  two-level namespace image (即如果 mach_header 中设置了 MH_WEOLEVEL 标志),则 n_desc 的高8位表示定义此未定义符号的库的编码。使用宏   GET_LIBRARY_ORDINAL  来获取此值, 或者使用宏  SET_LIBRARY_ORDINAL 来设置此值。0 指定当前 image。 1到253根据文件中 LC_LOAD_DYLIB 命令的顺序库号。254用于需要动态查找的未定义符号 (仅在 OS X v10.3和更高版本中受支持)。对于从可执行程序加载符号的插件。255,用来制定可执行 image。对于  flat namespace images,高8位必须为0。
n_value
符号值。对于 symbol table 中的每一项,该值的表达的意思都不同 (具体由n_type 字段说明 )。对于N_SECT符号类型,n_value 是符号的地址。 有关其他可能值的信息,请参见n_type字段的描述。
Common symbols 必须为 N_UNDF 类型,并且必须设置N_EXT位。Common symbols 的 n_value 是符号表示的数据大小(以字节为单位)。在C语言中,Common symbol是在该文件中声明但未初始化的变量。 Common symbols  只能出现在 MH_OBJECT 类型的 Mach-o文件中。

section 的名称与作用



 

nm命令

打印 nlist 结构的符号表(symbol table)。

常用nm命令参数







 

 

 

 

        

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值