Я хотел бы извиниться за терминологию и возможные глупые вопросы, я новичок в C++ и архитектуре ОС.
У меня есть файл library.so, скомпилированный для x86 32bit, из которого мне нужно использовать функцию. С помощью IDA я знаю символы и имя функции и ее параметров.
Я создал файл.cpp с вызовом dlopen()
чтобы импортировать библиотеку, а затем получить указатель на функцию по ее имени и, наконец, вызвать функцию из библиотеки с двумя параметрами: "4d"
, "13a7330873d6e062"
#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>
int main(int argc, char **argv) {
void *handle;
char * (*cipher)(const char *,const char *);
char *error;
handle = dlopen ("/path/to/library.so", RTLD_LAZY);
if (!handle) {
fprintf (stderr, "%s\n", dlerror());
exit(1);
}
dlerror(); /* Clear any existing error */
cipher = (char * (*)(const char *,const char *)) dlsym(handle, "known_function_name");
if ((error = dlerror()) != NULL) {
fprintf (stderr, "%s\n", error);
exit(1);
}
printf ("%s\n", (*cipher)("4d","13a7330873d6e062"));
dlclose(handle);
return 0;
}
Затем я попытался скомпилировать его с g++ - 4.6 (потому что, как я вижу в содержимом lib, он был скомпилирован с использованием gcc 4.6) со следующими параметрами:
g++-4.6 -o test test.cpp -ldl
Он компилируется без каких-либо предупреждений/ошибок, но когда я запускаю. /test, я получаю:
/usr/lib/i386-linux-gnu/libc.so: invalid ELF header
Если я попытаюсь выполнить readelf -h/usr/lib/i386-linux-gnu/libc.so, я получаю что-то вроде "Невозможно прочитать в 0x2074 байтах заголовков разделов... Не файл ELF". Хорошо, если я делаю символическую ссылку на /lib/i386-linux-gnu/libc.so.6, тогда она отлично читается, но когда я снова запускаю файл:
/path/to/library.so: undefined symbol: __stack_chk_guard
Я получаю точно такие же сообщения, если я пытаюсь импортировать файл.so в код класса Java-теста.
Вопрос в том, как правильно импортировать.so lib в мою проразу, зная подпись функции. У меня нет файла заголовка для библиотеки.
благодаря
ОБНОВЛЕНИЕ: я попытался поставить
void *__stack_chk_guard;
в мой файл test.cpp (если я понял это правильно) и перекомпилировал его с -fstack-protector
, но это не помогло, я все еще получаю
/path/to/library.so: undefined symbol: __stack_chk_guard
Также: он отлично компилируется с моим текущим /usr/lib/i386-linux-gnu/libc.so, НО, когда я его запускаю, он жалуется на это, как я сказал ранее:
/usr/lib/i386-linux-gnu/libc.so: invalid ELF header
Если я его создам и создаю symlink/usr/lib/i386-linux-gnu/libc.so ->/lib/i386-linux-gnu/libc.so.6, то он не будет компилироваться с помощью:
/usr/lib/gcc/i686-linux-gnu/4.6/../../../i386-linux-gnu/crt1.o: In function '_start':
(.text+0xc): undefined reference to '__libc_csu_fini'
/usr/lib/gcc/i686-linux-gnu/4.6/../../../i386-linux-gnu/crt1.o: In function '_start':
(.text+0x11): undefined reference to '__libc_csu_init'
collect2: ld returned 1 exit status
но затем он работает с
/path/to/library.so: undefined symbol: __stack_chk_guard
Убедитесь, что библиотека содержит все зависимости, загруженные правильно. Если вы используете разные библиотеки, в нем, вероятно, нет __stack_chk_guard. Проверьте с помощью ldd и других инструментов.
btw __stack_chk_guard не очень популярна в архитектуре x86...