Ruang alamat ruang bagian .bss dalam file elf

Jika saya memahaminya dengan benar, dengan membuat bagian bertipe .bss (seperti contoh kode di bawah ini), area tulis/baca bagian .bss adalah dari offset bagian dalam file menjadi N dan dalam hal ini phdr.p_memsz bertambah N byte dan terserah sistem operasi/kernel nol di area memori ini. Apakah penafsiran saya benar?

    Elf32_Phdr phdr;
    // ...
    phdr.p_memsiz = somevalue;
    Elf32_Shdr sec;
    // ...
    sec.sh_name   = bss_name;
    sec.sh_type   = SHT_nobits;
    sec.sh_flags  = SHF_alloc + SHF_write;
    sec.sh_size = N;
    phdr.p_memsiz += N;

person The Mask    schedule 04.04.2014    source sumber


Jawaban (1)


Ya, OS akan mengisi bagian .bss dengan angka nol.

Secara umum, Linux (dan versi Unix lainnya) akan menghilangkan semua halaman "baru" dalam suatu proses, untuk menghindari kebocoran konten dari "pemilik sebelumnya" (anggap saja seperti merobek-robek daur ulang Anda).

Sunting:

Pada akhirnya, linker dan loader bertanggung jawab atas lokasi sebenarnya dari bagian .bss. Biasanya terletak di akhir bagian data, seperti yang dijelaskan dalam spesifikasi ELF 1.2, Gambar 2.5.

Seperti yang dijelaskan oleh "Bagian", bagian .bss memiliki tipe SHT_NOBITS. Meskipun tidak menempati ruang dalam file, namun berkontribusi pada gambar memori segmen. Biasanya, data yang belum diinisialisasi ini berada di akhir segmen, sehingga membuat p_memsz lebih besar dari p_filesz.

(Di bagian lain dijelaskan bahwa konten dijamin nol)

Anda dapat menemukan spesifikasinya di sini (dan banyak tempat lainnya, namun situs ini juga memiliki beberapa dokumen ekstensi yang berguna, dll) http://refspecs.linuxbase.org/

Kode sumber LLVM dan dokumen terkait juga cukup mudah dibaca (IMO): http://llvm.org/docs/doxygen/html/Support_2ELF_8h_source.html

Informasi tentang cara menentukan tautan dan urutan, lokasi bagian: http://www.math.utah.edu/docs/info/ld_3.html

person Mats Petersson    schedule 04.04.2014
comment
Saya kira begitu, tapi saya tidak sepenuhnya yakin apa yang Anda coba lakukan - Saya pikir Anda bertanya Apakah memori yang dialokasikan dijamin nol - Saya belum melihat secara dekat bagaimana wilayah dihasilkan, tapi sepertinya wajar. - person Mats Petersson; 05.04.2014
comment
Saya hanya mencoba mengetahui di mana memulai dan mengakhiri wilayah bagian .bss. - person The Mask; 05.04.2014
comment
Tidak yakin apa yang Anda maksud... Lokasinya adalah kombinasi linker dan loader yang memuat file ke dalam memori. Kode Anda terlihat OK untuk memperluas .bss sebanyak N byte. - person Mats Petersson; 05.04.2014
comment
Maaf jika saya tidak cukup jelas. Asumsikan itu adalah eksekusi statis dan tidak dinamis. Ini memiliki 2 bagian juga phdr dan ehdr tetap: .text dan .bss. jadi saya punya total 4 bagian. .bss adalah yang terakhir dalam file elf dan memiliki sh_size = sizeof(int) * 2 yang berarti ada ruang untuk dua variabel statis. Yang ingin saya pahami adalah di mana area segmen ini (dalam hal ini sizeof(int) * 2) dimulai dan diakhiri, yaitu alamat memori dan offsetnya. Tidak jelas jadi saya berasumsi itu dari akhir bagian offset .bss di file elf hingga ukuran yang saya tentukan: sizeof(int) * 2). - person The Mask; 05.04.2014
comment
Seperti saya katakan, ini bergantung pada tautannya - tetapi biasanya, ini akan berada tepat setelah segmen .data (atau segmen .bss sebelumnya, jika ada lebih dari satu). Anda dapat menulis file konfigurasi linker yang menempatkan .bss di alamat yang jauh dari .data. Biasanya .bss mengikuti segera setelah .data. (Dan semua bagian .bss saling mengikuti) - person Mats Petersson; 05.04.2014
comment
Edit jawaban Anda dengan komentar ini untuk saya terima. Selain itu, apakah Anda memiliki sumber daya yang bagus (juga file spesifikasi ELF) agar saya lebih memahami hal-hal yang terkait dengan ELF ini? - person The Mask; 05.04.2014