2011-07-29 19 views
10

Tôi đang tạo thứ gì đó giống như trong câu hỏi How to collect data from different .a files into one array? How to keep sections in .a files with ld script?, tức là các mảng được tạo trong thời gian liên kết ngoài các phần tử từ các tệp đối tượng khác nhau.Tiêm các phần vào tập lệnh ld GNU; tương thích kịch bản giữa các phiên bản của binutils.

Trong trường hợp của tôi, có một số mảng, mỗi mảng đi vào phần riêng của nó, .ld_comp_array_ *, trong đó * khớp với tên của mảng. Sau đó, tôi đưa kịch bản mối liên kết mặc định sử dụng ld --verbose và sửa đổi nó bằng cách đặt tất cả các phần sau (sắp xếp, để các phần tử của mảng khác nhau không có được hỗn hợp) vào một phần đầu ra:

KEEP (*(SORT_BY_NAME(.ld_comp_array*))) 

và tất cả mọi thứ công trình khỏe. Sau đó mọi thứ trở nên phức tạp hơn một chút, bởi vì (các) ứng dụng sử dụng tính năng này có thể được xây dựng cho nhiều nền tảng khác nhau - cho đến nay, tôi đã thử thành công AVR Xmega làm nền tảng đích, cũng như Windows 32 bit và Linux 32- và 64-bit để thử nghiệm đơn vị và danh sách mở (các nền tảng mới có thể sẽ được thêm vào trong tương lai gần).

Tuy nhiên, đối với mỗi nền tảng cụ thể, tập lệnh liên kết mặc định khác với trên các nền tảng khác và hiện tại tôi chèn các phần .ld_comp_array * theo cách thủ công - có thể tự động làm điều đó bằng cách nào đó không? Giải pháp duy nhất tôi nghĩ là phân tích cú pháp tập lệnh mặc định và dán phần mô tả phần đầu vào ở trên, nhưng điều này có vẻ quá nặng.

Tôi có thể thực hiện thủ công nếu không có giải pháp tương đối đơn giản, nhưng tôi không chắc liệu tập lệnh mặc định có được từ phiên bản cục bộ của ld có thể phá vỡ phiên bản binutils khác không. Bất cứ ai có thể làm rõ liệu điều này có an toàn hay không?

Trong trường hợp nó có thể được thực hiện tự động, nó là ok để "tiêm" các đặc điểm kỹ thuật phần đầu vào luôn luôn trực tiếp vào phần .tiếp theo, giả sử mảng được coi là "bất biến"?

Trả lời

15

Tôi đã tìm thấy giải pháp thỏa mãn cho vấn đề đó. GNU ld có tùy chọn INSERT làm cho tập lệnh được hỗ trợ bên ngoài không ghi đè lên tập lệnh mặc định, nhưng chỉ cần thêm phần mới ở vị trí tương đối với một số phần tồn tại trong tập lệnh mặc định.

Vì vậy, trong trường hợp của tôi, kịch bản truyền cho các mối liên kết có thể đơn giản như:

SECTIONS 
{ 
    .rodata.ld_comp_array : 
    { 
    *(SORT_BY_NAME(.ld_comp_array*)) 
    } 
} 
INSERT AFTER .rodata; 

Thông tin thêm về các tùy chọn INSERT: http://sourceware.org/binutils/docs/ld/Miscellaneous-Commands.html#Miscellaneous-Commands