Загрузка данных


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

void test_load(const char *lib_path, int dlopen_flag, const char *flag_name) {
    void *handle;
    int (*func)(int, int);
    char *error;

    printf("\n=== Тест с флагом %s ===\n", flag_name);

    handle = dlopen(lib_path, dlopen_flag);
    if (!handle) {
        printf("ОШИБКА dlopen: %s\n", dlerror());
        return;
    }
    printf("dlopen успешен\n");

    dlerror();
    func = (int (*)(int, int)) dlsym(handle, "add");
    error = dlerror();
    if (error) {
        printf("Ошибка dlsym(add): %s\n", error);
    } else {
        printf("Функция add найдена, 10+5 = %d\n", func(10, 5));
    }

    int (*broken)(int);
    *(void **)(&broken) = dlsym(handle, "broken_function");
    error = dlerror();
    if (error) {
        printf("Ошибка dlsym(broken_function): %s\n", error);
    } else {
        printf("broken_function найдена, пробуем вызвать...\n");
        int res = broken(42);
        printf("Результат: %d\n", res);
    }

    int (*safe)(int);
    *(void **)(&safe) = dlsym(handle, "safe_function");
    if (!dlerror()) {
        printf("safe_function вызвана: 21*2 = %d\n", safe(21));
    }

    dlclose(handle);
}

int main() {
    const char *lib = "./libbroken.so";
    test_load(lib, RTLD_LAZY, "RTLD_LAZY");
    test_load(lib, RTLD_NOW,  "RTLD_NOW");
    return 0;
}