2012-02-08 20 views
5

मैं दो स्थैतिक पुस्तकालयों को विलय करने वाली एक बड़ी स्थिर पुस्तकालय बनाने की कोशिश कर रहा हूं। पल में मैं 'ar' आदेश का उपयोग कर रहा हूँ, 'ar' फिर से उपयोग की वस्तुओं निकालने, उदाहरण के लिए, 'आ' और 'बा' से और उसके बाद reassembling इन वस्तुओं:मैं बार-बार ऑब्जेक्ट फ़ाइलों वाली स्थिर libs कैसे निकाल सकता हूं?

$ ar x a.a 
$ ar x b.a 
$ ar r merged.a *.o 

दुर्भाग्य से यह काम नहीं कर रहा मेरे उद्देश्य के लिए, चूंकि एए समान नाम के साथ विभिन्न वस्तुओं के अंदर है। 'Ar' कमांड दोहराए गए ऑब्जेक्ट्स निकालने और पहले से निकाले गए लोगों को उसी नाम से बदल रहा है। यहां तक ​​कि एक ही नाम के साथ, इन वस्तुओं के अलग-अलग प्रतीकों हैं, इसलिए मुझे अपरिभाषित संदर्भ मिलते हैं क्योंकि कुछ प्रतीकों को प्रतिस्थापित फ़ाइलों के साथ याद किया जा रहा है।

मुझे मूल वस्तुओं तक कोई पहुंच नहीं है और पहले से ही 'ar xP' और 'ar xv' और बहुत सारी 'ar stuff' की कोशिश की है। क्या कोई मुझे इन libs को मर्ज करने के तरीके दिखाने में मदद कर सकता है?

अग्रिम धन्यवाद।

उत्तर

3

मैंने 'ar p' की कोशिश की, लेकिन एक दोस्त से बात करने का निर्णय लिया गया कि निम्नलिखित पायथन समाधान बेहतर हो सकता है। अब बार-बार ऑब्जेक्ट फ़ाइलों को निकालना संभव है।

def extract_archive(pathtoarchive, destfolder) : 

    archive = open(pathtoarchive, 'rb') 

    global_header = archive.read(8) 
    if global_header != '!<arch>\n' : 
     print "Oops!, " + pathtoarchive + " seems not to be an archive file!" 
     exit() 

    if destfolder[-1] != '/' : 
     destfolder = destfolder + '/' 

    print 'Trying to extract object files from ' + pathtoarchive 

    # We don't need the first and second chunk 
    # they're just symbol and name tables 

    content_descriptor = archive.readline() 
    chunk_size = int(content_descriptor[48:57]) 
    archive.read(chunk_size) 

    content_descriptor = archive.readline() 
    chunk_size = int(content_descriptor[48:57]) 
    archive.read(chunk_size) 

    unique_key = 0; 

    while True : 

     content_descriptor = archive.readline() 

     if len(content_descriptor) < 60 : 
      break 

     chunk_size = int(content_descriptor[48:57]) 

     output_obj = open(destfolder + pathtoarchive.split('/')[-1] + '.' + str(unique_key) + '.o', 'wb') 
     output_obj.write(archive.read(chunk_size)) 

     if chunk_size%2 == 1 : 
      archive.read(1) 

     output_obj.close() 

     unique_key = unique_key + 1 

    archive.close() 

    print 'Object files extracted to ' + destfolder + '.' 
+1

बढ़िया, मुझे एक ही समस्या थी और इस स्क्रिप्ट ने इस मुद्दे को हल किया। लेकिन मुझे विश्वास है कि आपको 48:57 के बजाय '' 'content_descripter [48:58]' '' लिखना चाहिए। [विकिपीडिया] (https://en.wikipedia.org/wiki/Ar_ (यूनिक्स) के अनुसार फ़ाइल आकार फ़ील्ड 9 बाइट्स के बजाय 10 बाइट्स है। –

+1

इसके अलावा, यदि आप .a फ़ाइल प्रारूप (उदाहरण के लिए, मैक पर) के बीएसडी संस्करण को संभालते हैं, तो फ़ाइल नाम शरीर भाग का हिस्सा हो सकता है, जैसा कि [विकिपीडिया] (https://en.wikipedia.org/wiki में बताया गया है)/Ar_ (यूनिक्स))। तो आपको इसे बाहर निकालने के लिए एक तर्क की भी आवश्यकता होगी। –

0

आप वस्तुओं का नाम बदल सकते हैं - उनके नाम का मतलब लिंकिंग के दौरान कुछ भी नहीं है। यह काम करना चाहिए:

mkdir merge-objs && 
cd merge-objs && 
ar x ../a.a && 
for j in *.o; do mv $j a-$j; done && 
ar x ../b.a && 
ar r ../merged.a *.o && 
cd .. && rm -rf merge-objs 
+2

समस्या वे नहीं है ' अभिलेखागार के बीच फिर से दोहराया जाता है, लेकिन उसी संग्रह के अंदर वस्तुओं को उसी lib के अंदर दोहराया जाता है! जब 'ar' उन्हें उसी संग्रह से ऑब्जेक्ट निकाल देता है, उसी नाम से ओवरराइट हो जाता है।लेकिन आपकी मदद के लिए धन्यवाद :) –

1
  1. आप तो फिर तुम निकाले वस्तुओं से एक नए पुस्तकालय का निर्माण करने के लिए है स्थिर पुस्तकालय से वस्तुओं (पुस्तकालय जो डुप्लिकेट किए गए ऑब्जेक्ट्स)
  2. निकालने के लिए किया है।
  3. नई लाइब्रेरी में डुप्लीकेट ऑब्जेक्ट्स का केवल एक उदाहरण होगा।
  4. आपको दो पुस्तकालयों (मूल-डुप्लिकेट के साथ एक और नया - डुप्लीकेट के बिना) की ऑब्जेक्ट्स की सूचियां बनाने के लिए ar t कमांड का उपयोग करना होगा।
  5. फिर दो सूची के बीच मतभेदों की जांच के लिए उदाहरण vimdiff का उपयोग करें।
  6. सभी मतभेद लिखें।
  7. तो केवल उन वस्तुओं (चरण 6) मूल पुस्तकालय से वस्तुओं को निकालने, आदेश का उपयोग ar एक्स my_original_lib.a object.o
  8. तो फिर तुम किसी भी नाम करने के लिए उत्पादित निकाले वस्तु का नाम बदलने
  9. फिर आदेश का उपयोग करें चाहते ar मीटर my_original_lib.a object.o object.o पुनर्व्यवस्थित करने के लिए
  10. तो चरण 7 के रूप में, एक ही आदेश का उपयोग करें, और आप दूसरे object.o निकाल देंगे
  11. नव निकाले वस्तु के लिए एक अलग नाम दें
  12. नई लाइब्रेरी बनाने के लिए दोनों का उपयोग करें।
  13. विधि स्थिर पुस्तकालय में किसी भी डुप्लिकेट ऑब्जेक्ट्स के लिए रखती है। बस सब dublicates
  14. निकालने के लिए बार-बार कदम 9 और 7 का उपयोग
+0

एक सी ++ कोड जो कई पुस्तकालयों को एक नए में विलय करता है, बिना संभावित डुप्लिकेट ऑब्जेक्ट्स को ओवरराइट किए बिना यहां है: http://bazaar.launchpad.net/~paulsepolia/+junk/arbet/files/head:/0025_arbet_FINAL/ – paulsepolia