C — Общая библиотека — dlopen, dlsym

в качестве темы исследования я использую программу на C ++ для перевода запроса SQL в программу на C ++. После перевода исходный код запроса c ++ компилируется в общую библиотеку:

g++ -O0 -g3 -fPIC -std=c++0x GeneratedQuery.cpp ../type/Types.cpp -shared -o lib.so

Все отлично работает и библиотека скомпилирована правильно. Во второй программе я пытаюсь реализовать цикл read-eval-print-loop, который принимает запрос от пользователя, переводит и компилирует его, загружает общую библиотеку с помощью dlopen и dlsym и, наконец, выполняет ее. До того, как я использовал Intel TBB в коде запроса, все работало нормально, но теперь я получаю ошибку сегментации для второго введенного мной запроса (первый запрос работает отлично, но второй запрос, загруженный в цикл, не выполняется).

Источник (read-eval-print-loop): http://pastebin.com/pWkRN7Dx

Пример кода запроса: http://pastebin.com/A1pBZC3d

Если в моем запросе нет объединения, и, следовательно, в исходном коде запроса возникает единственная параллель_ для, проблем не возникает. Но если есть несколько параллельных_форов, я получаю ошибку сегментации для второго запроса, который я ввожу (компиляция успешна, и dlopen работает, но dlsym терпит неудачу).

Вот вывод GDB

0x00007ffff7de394b in ?? () from /lib64/ld-linux-x86-64.so.2
0x00007ffff7de429e in ?? () from /lib64/ld-linux-x86-64.so.2
0x00007ffff7de4523 in ?? () from /lib64/ld-linux-x86-64.so.2
0x00007ffff6cc612a in ?? () from /lib/x86_64-linux-gnu/libc.so.6
0x00007ffff7bd7044 in ?? () from /lib/x86_64-linux-gnu/libdl.so.2
0x00007ffff7de9176 in ?? () from /lib64/ld-linux-x86-64.so.2
0x00007ffff7bd752f in ?? () from /lib/x86_64-linux-gnu/libdl.so.2
0x00007ffff7bd709a in dlsym () from /lib/x86_64-linux-gnu/libdl.so.2
0x000000000041fd58 in main (argc=1, argv=0x7fffffffe1d8) at ../src/tpcc.cpp:141

Я действительно не понимаю, что не получается для второго запроса. Я пробовал разные флаги для dlopen, но он не работал ни для какой комбинации.

Надеюсь, что кто-то может мне помочь, так как я очень неопытен в общих библиотеках.

С уважением

0

Решение

Попробуй заменить

extern "C" { void run { ... } }

в

extern "C" void run { ... }

Смотрите объяснение в великом http://www.isotton.com/devel/docs/C++-dlopen-mini-HOWTO/C++-dlopen-mini-HOWTO.html бумага.

3

Другие решения

Я не совсем уверен, что то, что я говорю, правильно или нет, но я помню, что в прошлом году у меня была проблема с аналогами, и я решил ее, создав .so с включенными библиотеками. Что-то вроде этого:

g ++ -O0 -g3 -fPIC -std = c ++ 0x GeneratedQuery.cpp ../type/Types.cpp {добавить сюда информацию по Intel .a и т. д.} -shared -o lib.so

Я использовал CMAKE, и мне пришлось добавить в add_library вещи.

Я надеюсь, что это поможет, если не извинения!

1

Работает, но я все еще в замешательстве:

Если я даю каждому файлу библиотеки другое имя, например lib..so, и загружаю его, все работает нормально. Есть ли что-то вроде кэша, который может привести к описанному выше поведению?

0
По вопросам рекламы [email protected]