2012-05-02 22 views
8

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

10

Để 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à:

  1. 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ượng readelf 's.
  2. 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.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ó.

14

BSS nằm giữa dữ liệu và vùng heap, như được mô tả chi tiết trong this marvelous article.

enter image description here

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 
+0

yep +1 cho bài viết đó u đã đăng thực sự là một bài đăng tuyệt vời – abhi

+0

+1 Bạn vẫn đang ở trên chương trình 32 bit? – JeremyP

+0

Đang chờ tất cả quảng cáo lên tới 64 bit để kết thúc :-)) – cnicutar

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