g ++ генерирует неправильные символы в динамической библиотеке - PullRequest
3 голосов
/ 23 декабря 2011

Я пытаюсь сделать простейшую библиотеку.

#include <stdio.h>
   void PutLoLoLo(){
   puts("Lololo");
}

компиляция с g ++:

g++ -shared -fPIC main2.cpp -o simple.so -Wall

и я получаю это в таблице символов:

:$ nm -D --dynamic --defined-only simple.so 
0000048c T _Z9PutLoLoLov
00002010 A __bss_start
00002010 A _edata
00002018 A _end
000004f8 T _fini
00000354 T _init

но я ожидаю что-то вроде этого:

0000048c T PutLoLoLo
00002010 A __bss_start
00002010 A _edata
00002018 A _end
000004f8 T _fini
00000354 T _init

Так что, конечно, я получаю ошибку dlopen () при попытке загрузить его.

Пожалуйста, помогите мне: что яделаешь неправильно?

Ответы [ 2 ]

4 голосов
/ 23 декабря 2011

C ++ искажает имена символов. Если вы хотите избежать искажения, функция должна быть объявлена ​​как extern C, например:

#include <stdio.h>
   extern "C" void PutLoLoLo(){
   puts("Lololo");
}

Тогда ссылка:

$ g++ -shared -fPIC lolo.cc -o lolo.so -Wall

даст вам то, что вы ожидаете:

$ nm -D --dynamic --defined-only ./lolo.so 
000000000000061c T PutLoLoLo
0000000000002018 A __bss_start
0000000000002018 A _edata
0000000000002028 A _end
0000000000000668 T _fini
0000000000000500 T _init

Вы сможете открыть библиотеку и получить символ через его «нормальное» имя. Функция ограничена наличием C семантики. Так, например, вы не можете сделать это с помощью функций-членов или использовать объекты с семантикой классов в качестве аргументов и т. Д. Поэтому, если вам нужно передать объекты, вам нужно будет принять эти аргументы как void * и привести.

3 голосов
/ 23 декабря 2011

Это похоже на искажение имени в C ++. Попробуйте это:

extern "C" void PutLoLoLo(){
   puts("Lololo");
}
...