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