【发布时间】:2021-05-23 23:10:32
【问题描述】:
假设我有一个使用标准 C 库中的 rand 函数的程序 (program.c)。
1 #include <stdlib.h>
2 int main(){
3 int rand_number = rand();
4 }
我还创建了一个共享库 (intercept.c),用于更改标准库中 rand 函数的行为(只需将 +1 加到结果中)。
int rand(void){
int (*rand_func)();
rand_func = dlsym(RTLD_NEXT, "rand");
int result = (*rand_func)();
return result + 1;
}
我运行程序
LD_PRELOAD=./intercept.so ./program
有没有什么方法可以在不修改program.c的源码的情况下获取行号(第3行)和调用者函数的名字(main)?
【问题讨论】:
-
C 标准没有为此提供任何便利。如果程序是用调试信息编译的,就有可能从中得到这些信息。这有点复杂,不太可能值得付出努力。
-
在使用
rand()之前,使用一些东西来为随机数生成器做种子,类似于:#include <time.h>和srand( (unsigned)time( NULL) ); -
@user3629249 功能齐全的 rand 函数在这种情况下并不重要。我只是举个例子。
标签: c shared-libraries ld dlsym