2010-07-19 37 views
21

Tôi đang cố gắng biên dịch một tệp thực thi (tệp ELF) không sử dụng bộ tải động. Tôi xây dựng một trình biên dịch chéo biên dịch mips từ Linux để được sử dụng trên một giả lập tôi đã thực hiện. Tôi đã khẳng định cờ -static-libgcc trong việc biên soạn tệp hello.cpp của tôi (chương trình hello world). Rõ ràng điều này là không đủ mặc dù. Bởi vì vẫn còn một phân đoạn trong tệp thực thi của tôi có chứa tên/đường dẫn của trình tải động. Tôi sử dụng những cờ nào để tạo một tệp thực thi chứa mọi thứ cần thiết để chạy? Tôi có cần phải xây dựng lại trình biên dịch chéo của mình không?Biên dịch một Static Static Executable

Trả lời

12

Thử sử dụng cờ -static?

+0

Có tài nguyên hay không mô tả ing kết quả chính xác của mỗi cờ gcc? Tôi không chắc chắn 100% liệu tôi có thực sự vô hiệu hóa tải động hay không. Khi tôi sử dụng -static tôi vẫn có tên của một bộ tải động được đặt vào phần .interp của tôi trong tập tin elf. –

+0

http://gcc.gnu.org/onlinedocs/gcc/Option-Index.html Tôi đã từng viết một hệ điều hành tải các tệp thi hành elf và tôi có thể xác nhận rằng cờ có hoạt động, chỉ cần bỏ qua các công cụ liên quan đến ld và nhảy trực tiếp đến điểm vào của tập tin thực thi – Tomaka17

+0

Tôi đã đọc một số điều về cách sử dụng một số tùy chọn cấu hình "-disable-shared". Điều này có cần thiết để biên dịch một tệp thực thi độc lập không? –

61

Sử dụng các cờ sau để liên kết

-static -static-libgcc -static-libstdc++ 

Dùng ba lá cờ để liên kết chống lại các phiên bản tĩnh của tất cả phụ thuộc (giả sử gcc). Lưu ý rằng, trong một số trường hợp nhất định bạn không nhất thiết cần cả ba lá cờ, nhưng chúng cũng không bị "tổn thương". Vì vậy, chỉ cần bật cả ba.

Kiểm tra nếu nó thực sự làm việc

  1. Hãy chắc chắn rằng đó thực sự là không có mối liên hệ năng động

    ldd yourexecutable 
    

    nên trở về "không phải là một động thực thi" hoặc một cái gì đó tương đương.

  2. Hãy chắc chắn rằng không có những biểu tượng chưa được giải quyết trái

    nm yourexecutable | grep " U " 
    

    Danh sách này nên được bỏ trống hoặc chỉ nên chứa một số biểu tượng hạt nhân không gian đặc biệt như

    U __tls_get_addr 
    
  3. Cuối cùng, kiểm tra xem bạn thực sự có thể thực thi tệp thực thi của bạn

+2

Đây phải là câu trả lời được chấp nhận! –