dli_sname为空时dli_address是空吗
时间: 2024-03-19 07:42:47 浏览: 168
不一定。`Dl_info`结构体中的`dli_address`字段表示符号的地址,`dli_sname`字段表示符号的名称。当`dli_sname`为空时,`dli_address`不一定为空。`dli_address`可能包含的信息包括:函数的起始地址、数据的地址、未定义符号的地址等等。具体取决于符号的类型和属性。
如果`dli_sname`为空,我们可以根据`dli_address`的值来推测符号的类型和属性。例如,如果`dli_address`指向代码段的地址区域,我们可以猜测这是一个函数的起始地址;如果`dli_address`指向数据段的地址区域,我们可以猜测这是一个全局变量或静态变量的地址;如果`dli_address`指向未定义符号的地址区域,我们可以猜测这是一个未定义的符号或引用。但是需要注意的是,这种猜测可能会有误,因为地址空间中可能存在重叠的区域,不同的符号可能会被映射到相同的地址区域。因此,推测符号类型和属性时需要谨慎,最好结合其他信息来进行推断和验证。
相关问题
exported symbol 被设置为空时怎么通过__builtin_return_address获得objective-c的方法名
如果 exported symbol 被设置为空,你可以通过 __builtin_return_address 函数获取调用栈上的指针,然后利用 Objective-C 运行时库中的函数进行符号化,从而获取方法名。
具体来说,你可以使用以下代码片段:
```objective-c
void *returnAddr = __builtin_return_address(0);
Dl_info info;
dladdr(returnAddr, &info);
NSString *symbolName = [NSString stringWithUTF8String:info.dli_sname];
NSString *methodName = NSStringFromSelector(NSSelectorFromString(symbolName));
```
其中,__builtin_return_address(0) 函数返回调用栈上的指针,dladdr 函数可以将指针转换为符号信息,NSStringFromSelector 函数可以将符号名转换为方法名。注意,此方法只适用于 Objective-C 方法,如果你需要获取 C 函数名,可以使用 info.dli_sname 直接获取。
还有其他方法能 在exported symbol 被设置为空时怎么通过__builtin_return_address获得objective-c的方法名
除了使用 `__builtin_return_address` 和 Objective-C 的运行时 API `sel_getName` 函数外,还可以使用 `dladdr` 函数获取当前函数所在的动态链接库(或可执行文件)的信息,进而获取当前函数对应的符号名称,再通过 Objective-C 的运行时 API `NSSelectorFromString` 函数将符号名称转换为对应的方法选择器,最终获取方法名。
具体步骤如下:
1. 在代码中调用 `__builtin_return_address` 函数获取当前函数的返回地址,例如:
```c
void *retAddr = __builtin_return_address(0);
```
2. 调用 `dladdr` 函数获取返回地址所在的动态链接库(或可执行文件)的信息,例如:
```c
Dl_info info;
dladdr(retAddr, &info);
```
3. 通过 `info.dli_sname` 可以获取当前函数对应的符号名称,例如:
```c
const char *symbolName = info.dli_sname;
```
4. 将符号名称转换为对应的方法选择器,例如:
```c
SEL sel = NSSelectorFromString([NSString stringWithUTF8String:symbolName]);
```
5. 最后,通过 Objective-C 的运行时 API `sel_getName` 函数获取方法选择器对应的方法名,例如:
```c
const char *methodName = sel_getName(sel);
```
这样就可以通过 `__builtin_return_address` 和 `dladdr` 函数获取当前函数对应的方法名了。需要注意的是,使用 `dladdr` 函数获取符号名称可能存在一定的限制和不稳定性,具体需要根据使用场景进行评估。
阅读全文