#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;
}