我正在尝试使用 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/