指向函数seg faulting的指针

时间:2015-11-17 23:56:08

标签: c dll segmentation-fault function-pointers dlsym

我正在构建一个用户定义的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!

1 个答案:

答案 0 :(得分:0)

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

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