ELF memuat alamat segmen kedua .data + .bss

Keluaran ELF dari readelf

Dalam hal ini, benarkah alamat:

.data mulai dari 0x08048054 hingga 0x08048054+0x0000e

.bss mulai dari 0x08048054+0x0000e hingga 0x0804805+0x00016

atau aku melewatkan sesuatu? tolong jelaskan untuk saya.

EDIT

Saya menggunakan perintah ini untuk mendapatkan informasi seperti pada gambar:

readelf -l filename

person The Mask    schedule 08.04.2014    source sumber
comment
Apakah Anda memiliki akses ke Skrip Linker atau apakah ini dikompilasi dengan skrip linker default? Jika ya, compiler/linker apa yang digunakan?   -  person nonsensickle    schedule 09.04.2014
comment
Masalahnya adalah, Anda tidak dapat mengetahui mana yang lebih dulu bss atau data kecuali Anda mendapatkan informasi skrip linker (dengan asumsi Anda menggunakan GCC atau Clang).   -  person nonsensickle    schedule 09.04.2014
comment
@nonsensickle: Itu dikompilasi dengan kompiler C lama. Saya tidak tahu tautannya digunakan tetapi saya dapat mencoba mencari tahu. Tapi biasanya .bss didahulukan, ini adalah perilaku pada sebagian besar kompiler, dalam hal ini, jika kita berasumsi itu juga untuk kompiler ini, apakah saya benar tentang alamatnya?   -  person The Mask    schedule 09.04.2014
comment
Jika Anda berasumsi bahwa .bss didahulukan maka .bss akan berada di 0x08048054 dan .data akan berada di 0x08048054+0x0000e. Ya, itu adalah asumsi yang wajar.   -  person nonsensickle    schedule 09.04.2014
comment
yang dapat dieksekusi tidak ditautkan secara dinamis seperti yang dikatakan perintah file: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, stripped dalam hal ini, tidak ada skrip tautan, bukan?   -  person The Mask    schedule 09.04.2014
comment
Benar, perpustakaan itu sendiri akan berisi informasi simbol yang kemudian akan melalui skrip linker yang digunakan aplikasi Anda. Jadi, jika demikian, Anda sebenarnya dapat mengontrol urutan penempatan .bss dan .data.   -  person nonsensickle    schedule 09.04.2014
comment
@nonsensickle: Maaf, maksud saya .data biasanya didahulukan.   -  person The Mask    schedule 09.04.2014
comment
@nonsensickle: Terima kasih banyak atas komentarnya. Anda dapat mempertimbangkan porting untuk menjawab. Pertanyaan terakhir: jika saya memiliki dua variabel global dengan nilai yang tidak diinisialisasi, katakanlah, a dan b pada mesin 32-bit di mana sizeof(int) = 4, a berada di 0x08048054+0x0000e dan b di 0x08048054+0x0000e+0x4 benar atau haruskah saya mempertimbangkan hal lain?   -  person The Mask    schedule 09.04.2014
comment
Global yang tidak diinisialisasi dan global yang diinisialisasi ke nol aktif di segmen .bss. Jika di situlah kita sepakat bahwa segmen .bss berada, maka kita dapat berasumsi bahwa a dan b keduanya berada dalam blok memori tersebut. Saya telah menjawab pertanyaan serupa di masa lalu dan akan mencoba memberi Anda beberapa tautan yang saya miliki di dalamnya.   -  person nonsensickle    schedule 09.04.2014
comment
Terima kasih lagi. Ini sangat membantu! Saya mencoba memahami format file ELF (untuk membuatnya sendiri). Saya tidak menemukan tutorial yang dapat saya pahami tentang hal-hal spesifik ini (saya sudah memiliki spesifikasi file ELF) jadi saya mempelajari keluaran dari beberapa kompiler lama karena kompleksitasnya lebih sedikit dan lebih baik untuk dipelajari saat ini.   -  person The Mask    schedule 09.04.2014
comment
Maaf saya tidak dapat menemukan tautan yang saya kira saya miliki. Sebagai gantinya, inilah postingan blog yang saya buat beberapa waktu lalu. Tidak semuanya relevan tetapi saya menyebutkan di mana Anda dapat mengharapkan variabel Anda ditempatkan saat menggunakan C. blog.lazar.co.nz/post/71304177510/how-an-arm-cortex-m3-boots, Anda dapat melewati sekitar setengah dari postingan itu dengan aman dan buka hal-hal terkait linker.   -  person nonsensickle    schedule 09.04.2014
comment
Terima kasih untuk artikelnya. Saya sudah membaca semua artikel. Bagus sekali. Pertanyaan lain (terakhir, sebenarnya) yang masih terkait: ketika kita membuat segmen PT_LOAD kedua yang merupakan .data + .bss bagian kita bersama-sama, ukuran p_filesiz dan p_memsiz diminta dan kernel siap untuk mengalokasikan (apakah mengalokasikan kata yang benar?) p_memsiz byte dan nol perbedaannya antara p_memsiz dan p_filesiz,   -  person The Mask    schedule 09.04.2014
comment
[lanjutan...] yaitu, N = p_memsiz - p_filesiz dan N adalah wilayah memori .bss yang sekarang diisi dengan angka nol. Dalam hal ini, di manakah alamat blok ini yang baru dialokasikan oleh kernel? yaitu, permintaan wilayah memori blok ini (dalam kasus kami di sini, di 0x08048054) apakah kernel memodifikasi p_paddr dan memasukkan alamatnya di sana? Saya harap ini jelas.   -  person The Mask    schedule 09.04.2014
comment
(maaf, maksud saya p_vaddr di komentar sebelumnya)   -  person The Mask    schedule 10.04.2014


Jawaban (2)


Oke, jadi saya harus mulai dari mana... Ya, baik .data dan .bss ada di wilayah itu dalam memori. Masalahnya adalah tidak ada cara untuk mengetahui urutannya.

Kita dapat berasumsi bahwa urutan default diikuti dan membuat tebakan, tetapi saya tidak menyukainya.

Melalui rangkaian komentar panjang di bawah pertanyaan Anda menyebutkan sesuatu yang menarik, yang tidak terlihat dalam pertanyaan Anda.

yang dapat dieksekusi tidak ditautkan secara dinamis seperti yang dikatakan perintah file: ELF 32-bit LSB dapat dieksekusi, Intel 80386, versi 1 (SYSV), tertaut secara statis, dilucuti dalam kasus ini, tidak ada skrip tautan, bukan? - Topeng

Dalam hal ini perpustakaan berisi tabel simbol dengan semua simbol offset. Tabel ini mencakup informasi bagian. Ini akan diproses oleh linker saat Anda mengkompilasi aplikasi Anda. Pada titik ini, skrip linker Andalah yang mengontrol urutan penempatan bagian .data dan .bss.

Jika ini adalah skrip linker default, carilah. Jika itu khusus, Anda harus memiliki akses ke sana dan membacanya. Jika tidak yakin uraikan di sini dan kami akan mencoba membantu :)

Saya sendiri telah menanyakan sebuah pertanyaan yang tidak berhubungan tetapi menawarkan contoh kode skrip linker dan beberapa kode C. Dalam skrip linker tersebut, segmen .bss muncul setelah segmen .data.

person nonsensickle    schedule 09.04.2014
comment
Terima kasih banyak. Dan Tidak. Tautannya bermanfaat. Tidak perlu menghapus. - person The Mask; 09.04.2014

Anda sedang melihat informasi header program, sedangkan header bagian mungkin adalah yang Anda perlukan. Mungkin ada banyak bagian yang terdapat dalam header program dan Anda tidak dapat secara tepat menyimpulkan ukuran dan persyaratan penyelarasan berbagai bagian.

Untuk melihat header bagian, gunakan:

membaca diri sendiri -S

person Tom Gooding    schedule 10.04.2014