我正在构建一个用户定义的shell。我有一个指向函数的数组 - 也就是说,一个充满共享库函数的数组,可以在任何时候调用它。
我在这里输入
Scan
我已经调试并确认我将指针放入数组的初始化工作正常,但这里是安全措施的代码......
typedef void (*func_ptr)(char **);
func_ptr function;
void *pointers_to_functions[64];
这是seg故障发生的地方 - 当我调用函数
时void initialize_built_in(){
void *handle;
char *error;
int i;
for (i = 0; i < 5; i++){
handle = dlopen(builtin_files[i], RTLD_LOCAL | RTLD_LAZY);
if (!handle) {
fprintf(stderr, "%s\n", dlerror());
exit(1);
}
pointers_to_functions[i] = dlsym(handle, builtin_functions[i]);
if ((error = dlerror()) != NULL) {
fprintf(stderr, "%c\n", *error);
exit(1);
}
if (dlclose(handle) < 0) {
fprintf(stderr, "%c\n", *dlerror());
exit(1);
}
}
}
我的共享库确实将argv作为参数 - 所以我不相信这是问题所在。
正如我所说,调试我发现指针数组中充满了地址。我想它可能是一个不正确的地址,但我在这里是一堵砖墙。
有什么想法吗?
所以我测试了函数调用的指针,在同一个文件中定义了我自己的函数类型(void *)。
int execute_built_in(char **argv){
int i;
//scan through the builtin_functions strings to find the correct index of pointers_to_functions - that is, they have the same ordering
for (i = 0; i < sizeof(builtin_functions); i++){
if (!strcmp(argv[0], builtin_functions[i])){
//the index has been found
function = pointers_to_functions[i];
function(argv); //execute function
return 0;
}
}
return -1;
}
其中函数只是向shell打印出来的东西
然后我在execute_function函数中添加了一个条件来强制执行......
func_ptr function;
void *testfunction(char **);
void *pointers_to_functions[64] = {testfunction};
并且它有效for (i = 0; i < sizeof(builtin_functions); i++){
if (i == 0){
function = pointers_to_functions[1];
char *bleh[] = {"bleh"};
function(bleh);
}
if (!strcmp(argv[0], builtin_functions[i])){
//the index has been found
function = pointers_to_functions[i];
function(argv); //execute function
return 0;
}
}
所以我对动态链接有问题,我看不到。或者使用我的共享库 - 这不太可能,因为我已经构建了成功的库,可以使用同一个项目的另一个shell代码。
那么,我的动态链接有什么问题?
这是一个示例共享库
WOOHOO!
答案 0 :(得分:0)
您的init函数错误:
你执行dlclose(handle)
导致你加载的所有lib都从内存中取消映射,显然,你希望调用的函数正在飞走。
在完全使用存储的函数指针之前,必须将lib映射到内存。
您可以通过观察segfaults实际位于库映射段中的地址(在/ proc / your_app_pid / maps中)来检查这一点