我真的很讨厌在这里问问题。但我一直在研究,像这样的解决方案似乎不起作用。可能是我对语法的误解。
我正在改进我的一些旧代码。问题中的函数在一些加载的模块中循环并运行一个函数。当我使用x86时,这段代码运行得非常好,但是跳到64位就把一切都搞砸了。

int FindCmd(ArgS *Args)
{
    /* We need to check our loaded modules for the appropriate command. */
    int found = 0;

    ModS *Current;

    for(Current = Modules; Current != NULL; Current = Current->Next)
    {   /* Cycle through the modules. */

        int (*OnConsoleCmd)(RootS *IRC, ArgS *Args, McapiS *Mcapi);

        /* The below statement is the problem. */
        OnConsoleCmd = (int (*)(RootS *, ArgS *, McapiS *))dlsym(Current->Handle, "OnConsoleCmd");
        /* The above statement is the problem. */

        if(OnConsoleCmd != NULL)
        {
            if(OnConsoleCmd(IRC, Args, Mcapi) != 0)     /* Run command. */
                found++;
        }
    }

    return found;
}

我收到以下警告:
exec/src/input.c:98:18: warning: cast to pointer from integer of different size

当然还有我的程序segfaults。我知道这只是一个选角问题,但我不知道一个简单和便携的解决方案。如果你需要更多的信息,请告诉我。谢谢。

最佳答案

这很可能是因为您在作用域中没有dlsym()的原型,因此它被隐式声明为int dlsym(),这是错误的。
如果您将#include <dlfcn.h>添加到使用dlsym()的文件中,您将得到正确的声明,它应该可以工作。

关于c - Dlsym:从不同大小的整数转换为指针,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7019820/

10-11 21:14