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


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

int main(void) {
    printf("=== Тест с флагом RTLD_LAZY ===\n");
    
    // Пытаемся загрузить библиотеку в "ленивом" режиме
    void *handle = dlopen("./libbroken.so", RTLD_LAZY);
    if (!handle) {
        printf("Ошибка dlopen: %s\n", dlerror());
        return 1;
    }
    printf("dlopen успешен\n");

    // Ищем и вызываем рабочую функцию add
    int (*add_fn)(int, int) = dlsym(handle, "add");
    if (add_fn) {
        printf("Функция add найдена, 10+5 = %d\n", add_fn(10, 5));
    }

    // Ищем сломанную функцию
    int (*broken_fn)(int) = dlsym(handle, "broken_function");
    if (broken_fn) {
        printf("broken_function найдена, пробуем вызвать...\n");
        broken_fn(5); // На этой строчке программа аварийно завершится (упадет)
    }

    // До этого места программа НЕ ДОЙДЕТ из-за падения выше!
    // Если бы мы убрали вызов broken_fn(5), то код ниже сработал бы:
    printf("\n=== Тест с флагом RTLD_NOW ===\n");
    dlclose(handle);
    
    handle = dlopen("./libbroken.so", RTLD_NOW);
    if (!handle) {
        printf("Ошибка при dlopen(RTLD_NOW): %s\n", dlerror());
    }
    
    return 0;
}