Nó được biết rằng phần .bss không được lưu trữ trong đĩa, nhưng phần .bss trong bộ nhớ nên được khởi tạo bằng không. nhưng nó nên lấy trong bộ nhớ ở đâu? Có bất kỳ thông tin nào được hiển thị trong tiêu đề ELF hay phần .bss có khả năng xuất hiện bên cạnh phần dữ liệu, hay cái gì khác không ??ở đâu phần .bss của tệp ELF có trong bộ nhớ?
Trả lời
Để biết nơi phân khúc BSS sẽ nằm trong bộ nhớ, nó là đủ để chạy readelf -S program
, và kiểm tra Thêm cột trên hàng .bss
.
Trong hầu hết các trường hợp, bạn cũng sẽ thấy phần dữ liệu được khởi tạo (.data
) xuất hiện ngay trước đó. Tức là, bạn sẽ thấy rằng Addr + Kích thước của phần .data
khớp với địa chỉ bắt đầu của phần .bss
.
Tuy nhiên, điều đó không nhất thiết phải xảy ra. Đây là các quy ước lịch sử và ELF specification (được đọc cùng với phần bổ sung nền tảng cụ thể, ví dụ Chương 5 trong một bao gồm 32-bit x86 machines) cho phép cấu hình phức tạp hơn, và không phải tất cả chúng đều được Linux hỗ trợ.
Ví dụ: phần này có thể không được gọi là .bss
. 2 thuộc tính duy nhất mà làm cho một phần BSS đó là:
- Phần được đánh dấu bằng
SHT_NOBITS
(có nghĩa là, phải mất không gian trong bộ nhớ nhưng không ai trên lưu trữ) mà xuất hiện nhưNOBITS
sản lượngreadelf
's. - Bản đồ có thể tải (
PT_LOAD
), có thể đọc (PF_R
) và đoạn có thể ghi (PF_W
). Phân đoạn như vậy cũng ngắn hơn về bộ nhớ so với bộ nhớ trong bộ nhớ (p_filesz
<p_memsz
).
Bạn có thể có nhiều phần BSS: Tệp thi hành PowerPC có thể có .sbss
và .sbss2
cho các biến dữ liệu chưa được khởi tạo.
Cuối cùng, phần BSS không nhất thiết phải tiếp giáp với phần dữ liệu hoặc vùng lưu trữ. Nếu bạn kiểm tra Linux kernel (cụ thể hơn chức năng load_elf_binary
), bạn có thể thấy rằng các phần BSS (hoặc chính xác hơn, segment nó ánh xạ tới) thậm chí có thể được xen kẽ với mã và dữ liệu được khởi tạo. Nhân Linux quản lý để sắp xếp nó.
BSS nằm giữa dữ liệu và vùng heap, như được mô tả chi tiết trong this marvelous article.
Bạn có thể tìm ra kích thước của từng bộ phận sử dụng size
:
[email protected]:~$ size try
text data bss dec hex filename
1108 496 16 1620 654 try
- 1. Nhập Bảng trong tệp ELF ở đâu?
- 2. phần nào của tệp ELF phải được tải vào bộ nhớ?
- 3. Do .bss phần zero khởi tạo biến chiếm không gian trong tập tin elf?
- 4. ở đâu "null" trong bộ nhớ
- 5. Phương thức được lưu trữ trong bộ nhớ ở đâu?
- 6. Lợi thế của việc có phần .bss là gì?
- 7. Trình liên kết tập lệnh - Đặt một phần ở phần cuối của vùng bộ nhớ
- 8. Tệp ELF bằng tay
- 9. Biến toàn cục trong tệp elf
- 10. Pandas: bộ nhớ bị rò rỉ ở đâu?
- 11. Hộp thoại bộ chọn tệp trong WPF ở đâu?
- 12. Làm cách nào để biết giá trị của tôi ở đâu trong bộ nhớ?
- 13. Làm thế nào để tìm bù đắp của bảng chuỗi tiêu đề phần của tệp elf?
- 14. x86 ASM Linux - Sử dụng Phần .bss
- 15. Tệp được gắn ở đâu?
- 16. các tệp nhật ký của tôi ở đâu trong heroku?
- 17. Biến cục bộ tĩnh ở đâu
- 18. Java tìm tệp ở đâu?
- 19. Đoạn văn bản lấy tên của nó ở đâu?
- 20. Lỗ hổng bộ nhớ trong mã này ở đâu và cách khắc phục?
- 21. Node.js đặt các tệp của nó ở đâu?
- 22. Npm tìm kiếm tệp package.json ở đâu?
- 23. Sử dụng phần ELF trong LKM
- 24. tệp JSTL .tld ở đâu?
- 25. Một chuỗi liên tục sẽ được lưu trữ trong bộ nhớ ở đâu?
- 26. BSS, Ngăn xếp, Heap, Dữ liệu, Mã/Văn bản - Trường hợp mỗi bắt đầu trong bộ nhớ này?
- 27. Bộ lọc trong TFS 2012 được xác định ở đâu?
- 28. Git lưu trữ tệp ở đâu?
- 29. Macro được lưu ở đâu?
- 30. Tôi nên viết một tệp tạm thời ở đâu?
yep +1 cho bài viết đó u đã đăng thực sự là một bài đăng tuyệt vời – abhi
+1 Bạn vẫn đang ở trên chương trình 32 bit? – JeremyP
Đang chờ tất cả quảng cáo lên tới 64 bit để kết thúc :-)) – cnicutar