Cを使用して動的ロードを試していますが、最初の段階で問題が発生しました。実行時にオブジェクトをロードする小さなプログラムがあります。オブジェクトには、いくつかのメッセージをstdinに書き込む単一の関数が含まれています。これは、OS X10.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;
}
Makefileは次のとおりです。
loader : loader.c module.o
cc -Wall loader.c -ldl -o loader
module.o : module.c
cc -Wall -fpic -c module.c
これは警告なしでコンパイルされますが、期待どおりに実行されません。プログラムは次のエラーを返します。
Error: dlopen(/users/user/dev/module.o, 2): no suitable image found. Did find: /users/user/dev/module.o: file too short
。
私は調べましたが、このエラーメッセージについてはあまりありません。このプログラムはdlopen
、TLDPの例に基づいています。これは、動的にロードするためにファイルが特定のサイズである必要があることを意味しますか、それともこれらのファイルのコンパイル方法に問題がありますか?
シンプルなものが足りない気がします。
このプログラムを期待どおりに実行するにはどうすればよいですか?
dlopen
通常のオブジェクトファイル()ではなく、共有ライブラリ(*.so
)をロードします*.o
。それらは互換性のないフォーマットです。
gccの場合libmodule.so
、-shared
フラグを出力して使用して共有ライブラリを作成する必要があります(cc
同じフラグを使用するかどうかはわかりません)。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加