2009-07-31 18 views
6

Tôi tò mò về những điều xảy ra trước khi hàm main() được gọi, chẳng hạn như tải tệp thực thi vào bộ nhớ, tải động của thư viện được chia sẻ. Bạn có bất cứ đề nghị làm thế nào để hiểu những điều này bằng một bài tập thực hành?Bất kỳ bài tập thực hành nào để hiểu cách chương trình được tải vào bộ nhớ và được thực hiện

Các công cụ amd những điều tôi biết, và sử dụng hiện nay, bao gồm:

  • strace
  • tháo rời
  • readelf
  • /proc/pid/đồ

GHI CHÚ: Tôi biết cuốn sách tuyệt vời linkers and loaders, nhưng thực hành tập thể dục có thể dạy cho tôi tốt hơn so với đọc cuốn sách.

Trả lời

3
  • Ld.so man page tài liệu một số biến môi trường có thể được đặt để tinh chỉnh quy trình liên kết động hoặc cung cấp thêm chi tiết.

ví dụ:

LD_DEBUG=all cat </dev/null 
  • Bạn có thể dễ dàng có được mã nguồn cho mỗi mảnh có liên quan - Linux kernel, mối liên kết động, thư viện C, mã khởi động (crt0.o hoặc tương tự). Bạn có thể bắt đầu bằng cách nghiên cứu mã và thực hiện các sửa đổi thử nghiệm.
3

Nếu bạn muốn kiểm tra cách một tệp nhị phân được đóng gói và các phần khác nhau của nó, tôi nghĩ chương trình tốt nhất hiện có là objdump.

Chọn bất cứ điều gì thực thi và làm:


objdump -S <executable> > myfile.S 

Một tập thể dục tốt sẽ là:

  • Tạo một chương trình mà sử dụng một thư viện bên ngoài
  • Biên soạn chương trình sử dụng tĩnh liên kết
  • Run chương trình
  • Đổi tên tệp thư viện và kiểm tra xem chương trình có chạy không
  • Biên soạn chương trình sử dụng thư viện chia sẻ
  • Đổi tên thư viện và kiểm tra xem chương trình chạy

Điều đó sẽ trả lời một số câu hỏi của bạn về những gì đang xảy ra dưới rèm cửa và làm thế nào.

1

Khi tôi học lớp OS ở trường đại học, chúng tôi đã sử dụng Nachos. Đây không phải là hệ điều hành mỗi se, nhưng là một loại hệ điều hành "mô phỏng" chạy trong không gian người dùng. Nó được viết bằng C++ và bạn có thể biên dịch các tập tin thực thi mà Nachos có thể tải và chạy. Bạn có thể chơi với giao diện cuộc gọi hệ thống và trong thử nghiệm chung nhiều như bạn muốn bằng cách ghép đôi với mã.

Chúng tôi chạy nó trong một phòng thí nghiệm Solaris, và tôi gặp rắc rối khi chạy và chạy trên Linux trên máy tính cá nhân của tôi, nhưng nó có thể là một món đồ chơi vui vẻ nếu bạn sẵn sàng đào sâu vào một số mã.

1

Tôi nhận ra rằng nó có thể là rất nhiều cho những gì bạn đang tìm kiếm nhưng viết lắp ráp của riêng bạn và mối liên kết sẽ rất giáo dục. Tôi đã làm điều đó khi tôi còn học đại học và yêu thích nó. Phải mất 120 giờ làm việc khi tôi nhớ lại để làm cho nó hoạt động cho những điều cơ bản tôi muốn nó làm. Tôi nghĩ rằng dự án này nhiều hơn bất cứ điều gì khác làm cho tôi chắc chắn rằng một nghề nghiệp trong lập trình là dành cho tôi.

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