C 指向函数seg错误的指针

C 指向函数seg错误的指针,c,dll,segmentation-fault,function-pointers,dlsym,C,Dll,Segmentation Fault,Function Pointers,Dlsym,我正在构建一个用户定义的shell。我有一个指向函数的指针数组——也就是说,一个充满共享库函数的数组,可以在任何时候调用 我在这里打字 typedef void (*func_ptr)(char **); func_ptr function; void *pointers_to_functions[64]; 我已经调试并确认我将指针放入数组的初始化工作正常,但下面是安全措施的代码 void initialize_built_in(){ void *handle; char *e

我正在构建一个用户定义的shell。我有一个指向函数的指针数组——也就是说,一个充满共享库函数的数组,可以在任何时候调用

我在这里打字

typedef void (*func_ptr)(char **);
func_ptr function;
void *pointers_to_functions[64];
我已经调试并确认我将指针放入数组的初始化工作正常,但下面是安全措施的代码

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);
         }
    }
}
函数只是将某些内容打印到shell

然后我在execute_函数中添加了一个条件来强制执行

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;
        }
    }

您的init函数错误: 执行
dlclose(handle)
,这会导致加载的所有库从内存中取消映射,显然,您希望调用的函数正在飞走。 在完全使用存储的函数指针之前,必须将库映射到内存


您可以通过观察seg故障的地址实际上位于库映射段(在/proc/your_app_pid/maps中)来检查这一点。

哪一行代码确切地导致了seg故障?调试器应该准确地告诉您函数的调用位置--
function(argv)
sizeof(内置函数)
需要是
sizeof(内置函数)/sizeof内置函数[0]
不是这样。循环执行正确的次数。内置函数是一个字符串数组。问题在于函数调用。我调用的函数将argv作为参数,我没有说这是根本原因。但这确实是个问题
sizeof(内置函数)
将以字节为单位显示数组大小,而不是元素数。如果问题仍然存在,请修复它,重新测试并更新代码。否则,没有一个像样的开发人员能够越过这个耀眼的bug来查看其他任何东西。应该提到的是,如果引用计数下降到0,dlclose只会导致库被卸载(例如,代码中的其他地方完全可能有另一个未显示的dlopen)。无论如何,这是一个很好的猜测,这就是为什么我在前面的评论中说“要么:库未加载”的原因。如果我想在数组中有多个函数指针,会发生什么?对于多个函数指针,保持映射打开是否可以接受?我希望这会使senseyes变得有效,只要保持句柄有效,使用dlsym()获得的任何符号都将保持有效。(顺便说一句,dxiv的评论是对的,在某些情况下,指针在dlclose之后仍然有效,因为lib仍然由代码的其他部分打开)
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;
        }
    }
#include <stdio.h>
#include <unistd.h>

struct NewBuiltIn{
    char *CommandName[64];
    char *FunctionName[64];
    char *AnalyzerName[64];
};

struct NewBuiltIn pluggin_method = {{"cd", "cd", ""}};

void cd(char *argv[]) {
    if(chdir(argv[1]) < 0){
        printf("There was an error in changing your directory. Please check the path name and retry.\n");
    }
}