Tệp thực thi nhị phân được cấu thành như thế nào? Hãy cùng khám phá!
- Tệp thực thi không phải là thứ không thể hiểu được, mà là một định dạng tệp chuẩn.
- Bài viết xử lý binary ELF trên Linux và dùng ngôn ngữ C, nhưng cũng có thể áp dụng cho các ngôn ngữ biên dịch khác.
- Tìm hiểu về symbol, section và segment.
- Symbol giống như tên hàm, được sắp xếp trong section, và section được cấu thành thành segment.
- Sử dụng công cụ
readelfđể quan sát chúng.
Bước 1: Mở bằng trình soạn thảo văn bản!
- Có thể xem binary theo cách đơn giản nhất và xác nhận được các chuỗi văn bản như "Penguin!" và "ELF".
Bước 2: Xem bảng symbol bằng readelf
- Có thể xem symbol bằng
readelf --symbols. - Có thể xác nhận các symbol như
main,puts,_start. - Chương trình không bắt đầu từ
mainmà từ_start.
Symbol
- Khi viết chương trình, symbol cho các hàm sẽ được tạo ra.
- Khi gọi một hàm từ thư viện, cần có symbol để tìm mã của hàm đó.
- Việc liên kết được thực hiện thông qua static linking và dynamic linking.
Bước 3: Xem binary bằng objdump và tìm hiểu về section!
objdumpcung cấp cách xem binary tốt hơn.- Có thể thấy các section như
.text,.rodata,.interp. - Section được dùng ở thời điểm liên kết, còn segment được dùng ở thời điểm thực thi.
Bước 4: Xem assembly!
- Section
.textchứa mã assembly. - Có thể xem mã assembly bằng
objdump -d.
Bước 5: Xem segment!
- Chương trình được cấu thành từ các segment hoặc program header.
- Có thể xem segment bằng
readelf --segments. - Segment quyết định cách tách các phần khác nhau của chương trình trong bộ nhớ.
Không phải phép thuật!
- Tệp thực thi không phải phép thuật, và ELF cũng giống như các định dạng tệp khác.
- Có thể dùng
readelf,nm,objdumpđể khảo sát binary Linux.
GN⁺ nhận định
- Bài viết này rất hữu ích cho các kỹ sư phần mềm mới bắt đầu trong việc hiểu cấu trúc của tệp thực thi nhị phân.
- Bài viết cung cấp thông tin thực tiễn về các khái niệm symbol, section, segment và các công cụ để khảo sát chúng (
readelf,objdump). - Nội dung cũng giúp xây dựng hiểu biết nền tảng về cách một chương trình thực sự được nạp vào bộ nhớ và thực thi, từ đó có thể khơi gợi hứng thú với lập trình hệ thống.
1 bình luận
Ý kiến trên Hacker News
Một người dùng khuyên nên tự tay viết ELF (Executable and Linkable Format), vì điều đó rất hữu ích để hiểu các phần cơ bản của tệp thực thi. Người này cũng nói bài viết này hữu ích cho những ai muốn tiếp cận từ trên xuống thay vì cách tiếp cận từ dưới lên vốn quen thuộc.
Một người dùng khác giải thích rằng khi chương trình chạy, ta có thể nghĩ nó bắt đầu ở
main, nhưng trên thực tế nó bắt đầu ở_start._startthực hiện nhiều công việc quan trọng, bao gồm gọimain, và đây không phải thứ chỉ riêng C mới có mà là điểm vào của nhị phân, không phụ thuộc ngôn ngữ.Một người dùng nhận xét các bài viết của Julia lúc nào cũng rất xuất sắc, đồng thời cho biết họ đã thu được kết quả tốt khi dùng lệnh
stringsđể dạy mọi người rằng mã đã biên dịch không hề cất giấu bí mật.Một người dùng nói rằng họ lần đầu học chủ đề này khi chuyển hướng học thuật từ toán học sang khoa học máy tính, và chưa bao giờ hối tiếc vì đã đào sâu vào nó. Họ cũng nhắc rằng Julia có nền tảng toán học, và cho rằng chính mong muốn suy luận theo hướng từ trên xuống như vậy có thể đã dẫn các nhà toán học đến với những thử nghiệm kiểu này.
Một người dùng chia sẻ trải nghiệm khi chứng minh rằng một “tệp thực thi thực sự có tính di động” có thể chạy trên nhiều nền tảng, điều này phản ánh việc tệp thực thi vốn gắn chặt với từng nền tảng. Điều đó cũng có nghĩa là lời giải cho bài toán đa nền tảng — thứ người ta đã cố xử lý bằng Java, thư viện đa nền tảng và nhiều cách khác — từ lâu đã ở ngay trước mắt chúng ta.
Một người dùng kể rằng vào đầu thập niên 90, họ đã bị cuốn hút bởi định dạng tệp thực thi và viết một trình xem tệp thực thi DOS và Windows bằng Modula 2. Chương trình này được phát hành dưới dạng shareware vào năm 1991 với tên VEXE, có một lượng người theo dõi nhất định trong giới cracker, và thậm chí còn được nhắc đến trong tài liệu hướng dẫn của +ORC.
Một người dùng nói rằng in tệp nhị phân ra terminal là nguồn cơn của nỗi buồn, và họ thích dùng
hexdump -Chơn.Nhiều người dùng nhận xét đây là một chuỗi thảo luận rất hay về chủ đề này.
Một người dùng khuyên những ai quan tâm đến chủ đề này nên đọc Cosmopolitan, RedBean, và "αcτµαlly pδrταblε εxεcµταblε (2020)".