2016-11-22 3 views
3

Я пытаюсь выполнить динамическую загрузку с помощью C, и я столкнулся с проблемой в самом начале. У меня есть небольшая программа, которая загружает объект во время выполнения. Объект содержит единственную функцию, которая записывает некоторые сообщения в stdin. Это было составлено на OS X 10.10 с clang. Вот код:C Динамический файл загрузки слишком короткий?

/* loader.c */ 

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

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

    char file[] = "https://stackoverflow.com/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. Означает ли это, что файлы должны быть определенного размера для динамической загрузки или что-то не так с тем, как эти файлы были скомпилированы?

Я чувствую, что мне не хватает чего-то простого.

Как получить эту программу для выполнения, как ожидалось?

ответ

2

dlopen нагрузка общей библиотек (*.so), а не обычные объектные файлы (*.o). Это несовместимые форматы.

Для НКИ, вы должны выводить на libmodule.so и используя -shared флаг, чтобы создать общую библиотеку (я не уверен, что если cc использует те же флаги).

0

Функция dlopen() загружает файл динамической библиотеки, названный нумерованным символом строки, и возвращает непрозрачный «дескриптор» для динамической библиотеки. Расширение динамической библиотеки .so. В вашей программе вы просто создаете модуль в объект, который является .so-файлом. Если вы хотите использовать dlopen(), вы должны создать свою программу в динамической библиотеке. Ниже приведен пример для вас:

module.so : module.c 
    cc -Wall - shared -fpic -c module.c 

Затем вы можете загрузить файл .so в программе:

dlopen("SO_PATH/module.so", RTLD_NOW); 
Смежные вопросы