C动态加载文件太短?

标签 c dlopen

我正在尝试使用 C 进行动态加载,但一开始就遇到了问题。我有一个在运行时加载对象的小程序。该对象包含一个将一些消息写入标准输入的函数。这是在 OS X 10.10 上用 clang 编译的。这是代码:

/* loader.c */

#include <stdlib.h>
#include <stdio.h>
#include <dlfcn.h>
#include "module.h"

int main(int argc, char **argv) {

    char file[] = "/users/user/dev/module.o";
    void *handle;
    int (*function)();

    handle = dlopen(file, RTLD_NOW);

    if (!handle) {

        printf("Cannot load program. Error: %s\n", dlerror());

        return 1;

    }

    program = dlsym(handle, "function");

    printf("Program loaded");

    function();

    printf("Exiting");

    return 0;

}

这是 module.h:

/* module.h */

int
function();

这是 module.c:

/* module.c */

#include <stdio.h>
#include <unistd.h>

int function() {

    printf("Hello from module");
    sleep(1);
    printf("Hello from module again");

    return 0;
}

这是生成文件:

loader : loader.c module.o
    cc  -Wall loader.c -ldl -o loader

module.o : module.c
    cc -Wall -fpic -c module.c

此编译没有警告,但它没有按我预期的方式执行。该程序返回以下错误:

错误:dlopen(/users/user/dev/module.o, 2):找不到合适的图像。找到:/users/user/dev/module.o:文件太短

我已经看了一下,关于此错误消息的内容并不多。该程序基于来自 TLDP 的 dlopen 示例。这是否意味着文件需要一定大小才能动态加载,或者这些文件的编译方式有问题?

我觉得我缺少一些简单的东西。

如何让这个程序按预期执行?

最佳答案

dlopen 加载共享 库(*.so),而不是普通目标文件(*.o) .它们是不兼容的格式。

对于 gcc,您应该输出到 libmodule.so 并使用 -shared 标志来创建共享库(我不确定 cc 使用相同的标志)。

关于C动态加载文件太短?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40732743/

相关文章:

c - 如何防止编译器优化内存访问基准 read() vs mmap() 性能?

c - 尽可能少链接的 dlopen/dlsym

c++ - 将 OpenMP 与 -fopenmp 和 -lgomp 链接起来的区别

c++ - 为什么在 dlopen 函数中传递的 std::any 的 std::any_cast 会引发错误

c++ - 在 OSX 上通过 dlopen 打开库时调试崩溃

c - 函数中的返回语句从不打印到屏幕

c++ - VC++ 9 QT 项目,转换为 Eclipse CDT

C++ 如何在 C++ 中使用 dlopen()?

c - ANSI C : How do I abstract over over struct fields?

c++ - 编写自定义脚本语言