2011-10-04 15 views
20

tải xuống và biên dịch glibc-2.13. khi tôi cố gắng chạy một chương trình mẫu C mà hiện một malloc(). Tôi nhận được lỗi sau elf file OS ABI invalidglibc: elf tệp OS ABI không hợp lệ

thể ai xin vượt qua bất kỳ con trỏ của tôi hữu ích trong việc giải quyết issue.Please ghi chú này mà phiên bản kernel của tôi là linux-2.6.35.9

+0

Đó là một chút thông tin ngắn. Bạn có chắc là bạn đang liên kết và chạy với libc đó không? – Mat

Trả lời

29

Đó không phải là phiên bản kernel của bạn đó là vấn đề.

Trình tải trên hệ thống của bạn không hỗ trợ Linux ABI mới. Cho đến gần đây, các tệp nhị phân Linux ELF đã sử dụng System V ABI. Gần đây, để hỗ trợ STT_GNU_IFUNC, số Linux ABI đã được thêm vào. Bạn sẽ phải cập nhật thư viện hệ thống C của mình để có trình tải hỗ trợ STT_GNU_IFUNC và sau đó nó cũng sẽ nhận dạng các đối tượng ELF với loại AB23 Linux ABI.

Xem Dave Miller's blog entry on STT_GNU_IFUNC for Sparc để hiểu được STT_GNU_IFUNC làm gì, nếu bạn quan tâm.

+1

Xin cảm ơn mkj. Đó là một thông tin tốt. Tôi chỉ thay thế ld-linux.so (về cơ bản, ld-2.13.so) và mọi thứ bắt đầu làm việc cho tôi. Chỉ trong trường hợp bạn đang tò mò, thiết lập của tôi là như thế tôi đã tạo ra một mục tiêu linux-diskless và chạy nó trên hộp ảo. Vấn đề bắt đầu xuất hiện khi trong thư mục gốc-fs tôi đã thay thế libc.so.6 (glibc-2.9 hoặc hơn) thành libc.so.6 (glibc-2.13) .Và khi so sánh OS-ABI của libc.so trước đó. 6 nó cho thấy "hệ thống V", trong đó phiên bản mới hơn có "Linux", như bạn đã nói. – Kapil

+0

Ah, tôi đã không nhận ra rằng bạn đã thay thế thư viện hệ thống C mà không cần phải thay thế bộ nạp, hoặc tôi sẽ cụ thể hơn trong lời khuyên của tôi. Tôi đã giả định bạn đang làm một cái gì đó như sử dụng LD_LIBRARY_PATH để tải một thư viện thay thế. Rất vui khi được giúp đỡ! – mkj

2

Có thể glibc của bạn được xây dựng với cờ --enable-multiarch rằng buộc sử dụng ifunc và mới LINUX ABI

1

Từ những gì tôi có thể nói là --enable-multiarch là thiết lập mặc định và bạn nên vô hiệu hóa nó bằng cách thiết lập --enable-multiarch=no.

0

Nếu bạn có được bàn tay của bạn trong bộ nạp từ một hệ thống mới hơn, bạn có thể làm cho nó hoạt động bằng cách sử dụng đó. Nhưng bạn sẽ phải mang theo bộ tải bất cứ nơi nào chương trình của bạn đi. Bạn có thể biên dịch chương trình của bạn để sử dụng bộ nạp đó như được giải thích here hoặc biên dịch chương trình của bạn và vá nó sau này bằng bản vá, theo cách tương tự như những gì tôi đề cập đến here. Tôi đã có thể chạy một chương trình đã cho tôi lỗi OS ABI invalid trên Linux 2.6.18 (cũ hơn của bạn) có ld-2.5.so, bằng cách sao chép một ld-2.15.so từ một nơi khác.

LƯU Ý: làm NOT ghi đè lên hệ thống ld * .so hoặc ld-linux của bạn. ; -/

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