2012-02-08 30 views
5

Tôi đang cố gắng xây dựng một thư viện tĩnh lớn kết hợp hai thư viện tĩnh. Trong khoảnh khắc tôi đang sử dụng lệnh 'ar', trích xuất các đối tượng, ví dụ, từ 'aa' và 'ba' và sau đó lắp lại các đối tượng sử dụng 'ar' một lần nữa:Làm cách nào để trích xuất các tệp lib tĩnh chứa các tệp đối tượng lặp lại?

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

Đáng tiếc là nó không được làm việc vì mục đích của tôi, vì aa có bên trong các đối tượng khác nhau với NAME TÊN. Lệnh 'ar' sẽ giải nén các đối tượng lặp lại và thay thế các đối tượng đã được trích xuất có cùng tên. Ngay cả với cùng tên, các đối tượng này có các biểu tượng khác nhau, vì vậy tôi nhận được các tham chiếu không xác định vì một số biểu tượng đang bị bỏ lỡ cùng với các tệp được thay thế.

Tôi không có quyền truy cập vào các đối tượng gốc và đã thử 'ar xP' và 'ar xv' và rất nhiều 'nội dung'. Có ai có thể giúp tôi cho thấy làm thế nào để hợp nhất các libs?

Xin cảm ơn trước.

Trả lời

3

Tôi đã thử 'ar p', nhưng nói chuyện với một người bạn đã quyết định giải pháp python sau có thể tốt hơn. Bây giờ có thể trích xuất các tập tin đối tượng lặp đi lặp lại.

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

Tuyệt vời, tôi đã có cùng một vấn đề và kịch bản này giải quyết được vấn đề. Nhưng tôi tin rằng bạn nên viết '' 'content_descripter [48:58]' '' thay vì 48:57. Trường kích thước tệp là 10 byte thay vì 9 byte theo [Wikipedia] (https://en.wikipedia.org/wiki/Ar_ (Unix)). –

+1

Ngoài ra, nếu bạn xử lý biến thể BSD của định dạng tệp .a (ví dụ: trên Mac), tên tệp có thể là một phần của phần nội dung, như được giải thích trong [Wikipedia] (https://en.wikipedia.org/wiki/Ar_ (Unix)). Vì vậy, bạn cũng sẽ cần một logic để loại bỏ nó ra. –

0

Bạn có thể đổi tên đối tượng - tên của chúng không có nghĩa gì trong khi liên kết. Điều này sẽ hoạt động:

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

Vấn đề không phải là họ' lặp lại giữa các bản lưu trữ, nhưng các đối tượng được lặp lại bên trong cùng một lib, bên trong cùng một kho lưu trữ! Khi 'ar' chiết xuất chúng, các đối tượng, từ cùng một kho lưu trữ, với cùng tên bị ghi đè.Nhưng cảm ơn sự giúp đỡ của bạn :) –

1
  1. Bạn cần phải trích xuất các đối tượng từ thư viện tĩnh (thư viện, trong đó có các đối tượng trùng lặp)
  2. Sau đó, bạn phải xây dựng một thư viện mới từ các đối tượng khai thác.
  3. Thư viện mới sẽ chứa CHỈ MỘT ví dụ của đối tượng được sao chép.
  4. Bạn phải sử dụng lệnh ar t để tạo danh sách các đối tượng từ hai thư viện (bản gốc-trùng lặp một và thư mới - không trùng lặp).
  5. Sau đó sử dụng ví dụ: vimdiff để kiểm tra sự khác biệt giữa hai danh sách.
  6. Ghi lại tất cả sự khác biệt.
  7. Sau đó giải nén chỉ những đối tượng (bước 6) các đối tượng từ thư viện ban đầu, sử dụng lệnh ar x my_original_lib.a object.o
  8. Sau đó đổi tên các đối tượng khai thác được sản xuất với tên bất kỳ mà bạn thích
  9. Sau đó sử dụng lệnh ar m my_original_lib.a object.o để sắp xếp lại các object.o
  10. Sau đó sử dụng lệnh tương tự, như bước 7, và bạn sẽ trích xuất các object.o thứ hai
  11. tặng một tên khác nhau cho các đối tượng mới được chiết xuất
  12. Sử dụng cả hai để xây dựng thư viện mới.
  13. Phương thức giữ cho bất kỳ số lượng đối tượng được sao chép nào trong thư viện tĩnh. Chỉ cần sử dụng các bước 9 và 7 lần để trích xuất tất cả các dublicates
+0

Mã C++ hợp nhất nhiều thư viện thành một thư viện mới, mà không ghi đè lên các đối tượng trùng lặp có thể có ở đây: http://bazaar.launchpad.net/~paulsepolia/+junk/arbet/files/head:/0025_arbet_FINAL/ – paulsepolia

Các vấn đề liên quan