2012-07-04 15 views
39

Mam polecenie c++filt do demolowania symbolu, jakie jest narzędzie do odwrotnego działania i zmień nazwę symbolu?Co to jest narzędzie Linux do łączenia nazwy symbolu C++?

Byłoby to przydatne, gdybym chciał zadzwonić pod numer dlsym() na zmanipulowaną nazwę funkcji C++. Wolę nie kodować nazwy kodu, ponieważ może się ona zmieniać z czasem z powodu nowych wersji kompilatora lub nowych kompilatorów, które są obecnie używane z powodu kompilacji dla wielu platform.

Czy istnieje programowy sposób uzyskania ciągu znaków reprezentującego funkcję C++ w czasie wykonywania, aby kod był niezależny od kompilatora? Jednym ze sposobów, aby to zrobić, byłoby wywołanie narzędzia w czasie kompilacji, które wykonuje mangling nazwy używanego kompilatora i wstawia odpowiednią zniekształconą nazwę symbolu C++ do ciągu znaków, który ma być użyty w postaci dlsym().

Here is the closest to a solution I've found on this site który jest realizowany za pomocą ustalonej nazwy stylu C dla pośrednich do symboli C++, które są zdefiniowane w bibliotece, którą chcesz dlsym(), ale jeśli nie masz kontroli nad tym, co zapewnia ta biblioteka, nie jest to opcja.

+13

Każdy używa kompilatora C++ do mangle nazw. –

+2

A może kompilator? –

+1

-1, kompilator jest jedyną rzeczą, której potrzebujesz ... i to jest oczywista odpowiedź. – Griwes

Odpowiedz

3

Możesz być w stanie uzyskać to, co chcesz, patrząc na tablicy symboli z .so ty patrzą na: Ktoś inny odpowiedział na to już Returning a shared library symbol table.

Jednak, jeśli zbyt wiele symboli ... może nie działać.
Oto szalony pomysł. Zastanówcie się nad emptorem!

Potencjalnym rozwiązaniem jest:

  1. utworzyć plik z odgałęzienie z dokładnie jedną nazwą: nazwę chcesz: void myfunction() {}

  2. skompilować ten plik (z - fPIC i -shared więc jest to dynamiczna biblioteka)

  3. wezwanie dlopen/dlsym na danym pliku

  4. Iterate powo używaj symboli (powinno być tylko jedno życzenie plus inne zwykłe śmieci, które możesz filtrować). Iteracja symboli jest niezdarny, ale można to zrobić: Returning a shared library symbol table

  5. dlclose(), aby zwolnić go (stracić niedopałek z swoimi symbolami)

  6. Otwórz plik, który chcesz z dlopen

Zasadniczo, by wywołać kompilator z kodu, byłoby stworzenie .so można patrzeć, uzyskać tylko wartość się, a następnie rozładować że .so więc można załadować w jednej chcesz.

To szaleństwo.

3

Wymazywanie nazw jest specyficzne dla implementacji.

Nie ma standardu na mangling nazw, więc najlepiej jest znaleźć kompilator, który zrobi to za Ciebie.

Name mangling

znajduje się stół tutaj, że może pomóc, jeśli chcesz to zrobić ręcznie

5

W ten sposób g ++ niszczy nazwy. Możesz zaimplementować te reguły dotyczące mangowania w twoim programie.

Innym (zwariowanym) rozwiązaniem byłoby wypisanie wszystkich symboli w bibliotece, której chcesz użyć (nie jest to takie trudne, jeśli znasz format), zdemontować je wszystkie i przeszukać nazwę funkcji na tej liście. Zaletą tej metody jest to, że demangling jest łatwiejszy, ponieważ istnieje wywołanie funkcji, aby to zrobić: abi::__cxa_demangle, z nagłówka cxxabi.h.

+0

zepsuty link! Znalazłem ten odnośnik: http://refspecs.linuxbase.org/cxxabi-1.83.html#mangling – fonini

0

Łatwiejsza metoda niż pierwsza opublikowana. napisać trochę program C++ jak:

#include <stdlib.h> 

extern int doit(const char *toto, bool is); 

int main(int argc, char *argv[]) 
{ 
    exit(doit (argv[0], true)); 
} 

Zbuduj go

# g++ -S test.cpp 

i wyodrębnić nazwę symbolu ze źródła asemblera

# cat test.s | grep call | grep doit | awk '{print $2}' 

Otrzymasz:

[email protected]:/tmp/TestC++$ cat test.s | grep call | grep doit | awk '{print $2}' 
_Z4doitPKcb 
[email protected]:/tmp/TestC++$ 

doit symbol zawikłany to _Z4doitPKcb Użyj kompilatora, którego planujesz użyć, ponieważ każdy kompilator ma własną regułę mieszania nazw (jak to zostało powiedziane wcześniej od jednego kompilatora do drugiego, reguły te mogą ulec zmianie).

Miłej zabawy!

+0

Ponieważ kompilatory mogą się różnić, pytanie wymaga sposobu w czasie wykonywania, aby obliczyć to dynamicznie. – WilliamKF