2011-05-09 24 views
34

Nếu kích thước tệp nhị phân không phải là một vấn đề, có bất kỳ hạn chế nào bằng cách sử dụng -g và không phải là các chuỗi nhị phân sẽ được chạy trong môi trường quan trọng về hiệu suất không? Tôi có rất nhiều không gian đĩa nhưng nhị phân là cpu chuyên sâu và sử dụng rất nhiều bộ nhớ. Các nhị phân được nạp một lần và còn sống trong vài giờ.gcc -g vs not -g và strip vs not strip, hiệu suất và sử dụng bộ nhớ?

EDIT:

Lý do tại sao tôi muốn sử dụng mã nhị phân với thông tin gỡ lỗi là để tạo ra hữu ích cốt lõi bãi trong trường hợp lỗi phân khúc.

+0

Tôi nghĩ câu hỏi sẽ xem liệu biểu tượng được tải vào bộ nhớ theo mặc định hay không. Nếu có, điều này sẽ góp phần làm tăng thời gian và mức tiêu thụ bộ nhớ. Câu hỏi thú vị, mong được trả lời. +1 – 0xC0000022L

+0

Tại sao không thử làm cả hai? –

+0

@unapersson: Thật khó để thực hiện các thử nghiệm như vậy trong môi trường của chúng tôi, vì hiệu suất phụ thuộc sâu sắc vào các yếu tố bên ngoài thay đổi nhanh chóng. – Johan

Trả lời

30

Trình tải ELF tải đoạn, không phần; ánh xạ từ các phần đến phân đoạn được xác định bởi tập lệnh liên kết được sử dụng để xây dựng tệp thực thi.

Tập lệnh trình liên kết mặc định không ánh xạ các phần gỡ lỗi cho bất kỳ phân đoạn nào, vì vậy điều này bị bỏ qua.

Thông tin biểu tượng có hai loại: biểu tượng tĩnh được xử lý ngoài băng và không bao giờ được lưu trữ dưới dạng dữ liệu phần; bảng biểu tượng động được tạo ra bởi trình liên kết và được thêm vào một phân đoạn đặc biệt được tải cùng với tệp thực thi, vì nó cần được truy cập tới trình liên kết động. Lệnh strip chỉ xóa các ký hiệu tĩnh, không bao giờ được tham chiếu trong phân đoạn.

Vì vậy, bạn có thể sử dụng thông tin gỡ lỗi đầy đủ thông qua toàn bộ quá trình và điều này sẽ không ảnh hưởng đến kích thước của hình ảnh thực thi trong RAM, vì nó không được tải. Điều này cũng có nghĩa là thông tin không được bao gồm trong các bãi lõi, vì vậy điều này không mang lại cho bạn bất kỳ lợi ích nào ở đây.

Tiện ích objcopy có tùy chọn đặc biệt để chỉ sao chép thông tin gỡ lỗi, do đó bạn có thể tạo tệp ELF thứ hai chứa thông tin này và sử dụng các tệp nhị phân bị tước; khi phân tích kết xuất lõi, sau đó bạn có thể tải cả hai tệp vào trình gỡ lỗi:

objcopy --only-keep-debug myprogram myprogram.debug 
strip myprogram 
+0

Cảm ơn bạn đã giải thích rõ ràng này! Để xác minh tôi hiểu chính xác ... Một tập tin nhị phân được xây dựng với -g sẽ thực hiện nhanh như một được tước (được xây dựng từ cùng một mã nguồn), và cả hai sẽ tạo ra cùng một kết xuất lõi trong trường hợp lỗi phân đoạn? – Johan

+0

Chính xác. Ngoài ra, tước một tập tin nhị phân loại bỏ các thông tin mà -g tạo ra/bảo quản, cộng thêm một chút nữa, do đó kết quả sau khi tước phải giống hệt nhau dù bạn có biên dịch với -g hay không. –

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