gpt4 book ai didi

c - 指向函数段错误的指针

转载 作者:太空宇宙 更新时间:2023-11-04 00:03:25 25 4
gpt4 key购买 nike

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

这是段错误发生的地方——当我调用函数时

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

我的共享库确实将 argv 作为参数——所以我不认为这是问题所在。

正如我所说,调试时我看到指针数组中填满了地址。我想这可能是一个不正确的地址,但我在这里一堵砖墙。

有什么想法吗?


所以我测试了指向函数调用的指针是否在同一文件中定义了我自己的函数类型 (void *)。

func_ptr function;
void *testfunction(char **);
void *pointers_to_functions[64] = {testfunction};

函数只是向 shell 打印一些东西

然后我在execute_function函数中加了一个条件强制执行...

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

它有效 WOOHOO!

所以我的动态链接有问题,我看不到。或者使用我的共享库——这不太可能,因为我已经构建了成功的库,这些库可以与同一项目的另一个 shell 代码一起使用。

那么,我的动态链接有什么问题吗?

这是一个共享库示例

#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");
}
}

最佳答案

你的初始化函数是错误的:你执行了一个 dlclose(handle) 导致你加载的所有库都从内存中取消映射,显然,你期望调用的函数正在飞走。在完全使用完存储的函数指针之前,必须将库映射到内存。

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

关于c - 指向函数段错误的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33769380/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com