2012-07-04 12 views
39

मेरे पास c++filt कमांड को डिमंगल करने के लिए कमांड है, विपरीत करने के लिए टूल क्या है और प्रतीक नाम को उलझाना है?सी ++ प्रतीक नाम को उलझाने के लिए लिनक्स उपयोगिता क्या है?

यह उपयोगी होगा अगर मैं dlsym() को एक उलझन में सी ++ फ़ंक्शन नाम पर कॉल करना चाहता हूं। मैं कोड में उलझने वाले नाम को कड़ी मेहनत नहीं करूँगा क्योंकि यह नए अनुपालन संस्करणों या नए प्लेटफार्म ब्रांडों के इस्तेमाल के कारण समय के साथ बदल सकता है या वर्तमान में कई प्लेटफार्मों के लिए संकलन के कारण।

क्या स्ट्रिंग प्राप्त करने के लिए एक प्रोग्रामेटिक तरीका है जो रनटाइम पर C++ फ़ंक्शन का प्रतिनिधित्व करता है ताकि कोड संकलक स्वतंत्र हो? संभवतः ऐसा करने का एक तरीका संकलन समय पर एक उपयोगिता को कॉल करना होगा जो कि कंपाइलर का उपयोग करने के लिए नाम बदलता है और उपयोग करने के लिए dlsym() के लिए उपयुक्त मैंगल्ड सी ++ प्रतीक नाम को स्ट्रिंग में डालता है।

Here is the closest to a solution I've found on this site जो सी ++ प्रतीकों कि पुस्तकालय आप dlsym() करना चाहते हैं में परिभाषित कर रहे हैं करने के लिए अप्रत्यक्ष के लिए एक निश्चित सी शैली नाम का उपयोग करके पूरा किया है, लेकिन आप क्या कि पुस्तकालय प्रदान करता है पर नियंत्रण नहीं है, तो, यह एक विकल्प नहीं है।

+13

हर कोई नाम बदलने के लिए एक सी ++ कंपाइलर का उपयोग करता है। –

+2

कैसे, कं, संकलक के बारे में? –

+1

-1, कंपाइलर केवल एक चीज है जो आपको चाहिए ... और यह काफी स्पष्ट उत्तर है। – Griwes

उत्तर

3

आप .so का प्रतीक तालिका को देखकर आप क्या चाहते प्राप्त करने में सक्षम हो सकता है आप देख रहे हैं: किसी और ने इसका उत्तर दिया है Returning a shared library symbol table

हालांकि, यदि बहुत सारे प्रतीक हैं ... जो काम नहीं कर सकते हैं।
तो यहां एक पागल विचार है। चेतावनी emptor!

  1. ठीक एक नाम के साथ एक ठूंठ साथ एक फ़ाइल बनाने:

    एक संभावित समाधान के लिए है नाम आप चाहते हैं: शून्य myfunction() {}

  2. उस फ़ाइल (संकलन के साथ - FPIC और कमरा साझा तो यह एक गतिशील पुस्तकालय)

  3. कॉल dlopen/कि विशेष रूप से फ़ाइल पर dlsym है

  4. दोहराएं अपरोक्ष आप प्रतीकों (केवल एक ही प्लस अन्य नियमित जंक होना चाहिए जो आप फ़िल्टर कर सकते हैं)। प्रतीकों के माध्यम से पुनरावृत्ति अनाड़ी है, लेकिन आप यह कर सकते हैं: Returning a shared library symbol table

  5. dlclose() यह खाली करने के लिए (अपने प्रतीकों में से बाहर ठूंठ खोना)

  6. फ़ाइल ओपन आप dlopen

  7. साथ चाहते हैं

मूल रूप से, आप अपने कोड से संकलक आह्वान होता है, इसे बनाने होगा .so अपने आप को देखो सकता है, केवल मूल्य बाहर निकलना एक है, तो उतारना कि .so तो आपको अपना इच्छित में लोड कर सकते हैं।

यह पागल है।

3

नाम मैंगलिंग कार्यान्वयन विशिष्ट है।

नाम मैंगलिंग के लिए कोई मानक नहीं है, इसलिए आपके लिए यह करने के लिए एक कंपाइलर ढूंढना आपकी सबसे अच्छी शर्त है।

Name mangling

एक मेज यदि आप ऐसा करना चाहते हैं आप मदद कर सकते हैं यहाँ नहीं है मैन्युअल रूप से

5

इस प्रकार g ++ mangles नाम हैं। आप अपने कार्यक्रम पर उन भयानक नियमों को लागू कर सकते हैं।

एक और (पागल) समाधान लाइब्रेरी के सभी प्रतीकों को सूचीबद्ध करना होगा जो आप उपयोग करना चाहते हैं (यदि आप प्रारूप को समझते हैं तो यह इतना मुश्किल नहीं है), उन सभी को ध्वस्त कर दें, और उस सूची में अपने फ़ंक्शन का नाम खोजें। इस विधि के साथ लाभ यह है कि demangling आसान है, क्योंकि ऐसा करने के लिए एक फ़ंक्शन कॉल है: abi::__cxa_demangle, cxxabi.h शीर्षलेख से।

+0

टूटी हुई लिंक को चिह्नित करूंगा! मुझे यह संदर्भ मिला: http://refspecs.linuxbase.org/cxxabi-1.83.html#mangling – fonini

0

पहले पोस्ट की तुलना में एक आसान तरीका। एक छोटे सी लिखें ++ प्रोग्राम की तरह:

#include <stdlib.h> 

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

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

# g++ -S test.cpp 

के साथ बनाएँ और कोडांतरक स्रोत से प्रतीक नाम निकालने

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

आप मिल:

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

doit प्रतीक मैंगलेड _Z4doitPKcb उस कंपाइलर का उपयोग करें जिसका आप उपयोग करने की योजना बना रहे हैं क्योंकि प्रत्येक कंपाइलर का अपना नाम मैंगलिंग नियम होता है (जैसा कि एक कंपाइलर से पहले यह कहा गया है कि ये नियम बदल सकते हैं)।

मज़े करो!

+0

क्योंकि शिकायतकर्ता भिन्न हो सकते हैं, सवाल इस गतिशील रूप से गणना करने के लिए रनटाइम पर एक तरीके से पूछ रहा है। – WilliamKF

संबंधित मुद्दे