为什么一个可执行文件strip掉符号表还能执行?

image

符号表里包含了在程序运行过程中需要用到的符号的所在节内的偏移量

下图是在section(text)里的[AppDelegate applicationwillResignActive]的代码段信息

我的理解是程序运行时通过解析符号表找到对应的代码段和数据段来执行。

群里有大佬说是最后是直接转成地址了,那总得有一个符号和地址对应的表吧?就像ios对象的isa一样,有method和implemention的对应关系。

1 Like

有啊。在objc自己的段里保存了地址和对应的objc信息映射表

那比如说如果我要在main函数里调用了一个viewdidload的方法,我现在有这个符号,那我怎么知道他的地址呢?我不是得通过符号表根据viewdidload这个字符串找到他在哪一个段,然后找到地址,才能执行!

那这样子的话还是需要符号表啊!!

可是我看某宝明明把符号表strip掉了,都能执行、

既然ios在执行时不是依赖符号表而执行,而是依赖自己独立的一套runtime,那是不是意味着我可以随意改符号表里的任何信息而不影响mach-o的运行。

可以这么说

符号只是符号,这个类可以用这个符号,另一个类也可以用这个符号。不同类对应的同个符号的函数地址是不同的。

通常针对C/C++来说,符号表是程序编译过程中链接必须的,而不是运行时必须。(当然如果有符号表,调试器会来解析地址)编译完以后就只有地址了。
而针对OC这类函数来说,又是另外一回事,本身OC的类和C++的类就不同。一个在运行时,一个在编译时。所以就算把符号表去掉以后,OC的函数符号还是能恢复,因为macho中有很多段保存了这些类信息。
具体可以看我写起写过的一篇文章
Frida调用栈符号恢复

2 Likes

高手,解释一步到位