不用dl_info,还有其他办法吗
时间: 2023-07-21 11:12:03 浏览: 45
如果不想使用`dladdr()`函数,您可以尝试使用平台相关的技术来获取上一级函数的起始地址。
在一些平台上,可以使用以下方法之一来获取上一级函数的起始地址:
1. 使用编译器扩展:某些编译器提供了扩展,可以直接获取调用者的函数地址。例如,在GCC和Clang编译器中,可以使用`__builtin_extract_return_addr()`函数来获取调用者的地址。
```c
void* caller = __builtin_extract_return_addr(__builtin_return_address(0));
```
2. 解析堆栈信息:通过解析堆栈信息,可以获取调用者的函数地址。具体实现方式因平台而异。在Linux上,可以使用`backtrace()`和`backtrace_symbols()`函数来获取堆栈信息。
```c
#include <execinfo.h>
void foo() {
void* return_addr = __builtin_return_address(0);
void* caller = NULL;
void* buffer[2];
int size = backtrace(buffer, 2);
if (size >= 2) {
caller = buffer[1];
}
printf("Current function: %p\n", return_addr);
printf("Previous function: %p\n", caller);
}
int main() {
foo();
return 0;
}
```
在上面的示例中,我们使用`backtrace()`函数获取堆栈信息,并从中提取出上一级函数的地址。
请注意,这些方法可能依赖于平台和编译器,并且不一定在所有情况下都有效。为了确保可移植性和可靠性,使用`dladdr()`函数仍然是一种常见的方法。