Menghancurkan biner saat membangun dengan PPC

saya sedang mengembangkan program untuk beberapa board, yang menggunakan Arsitektur PowerPC. Saya baru saja membuat beberapa perubahan pada repositori, melakukan refaktorisasi sedikit dan memindahkan serta menghapus kelas.

Di mesin pengembangan saya (VM linux x64), binari dibuat dengan baik dan dapat dieksekusi. Ketika saya membangun dengan CorssCompile Toolchain, itu berjalan dengan lancar tanpa kesalahan atau peringatan apa pun. Tetapi pada sistem target saya tidak dapat menjalankan programnya, sepertinya program tersebut bahkan tidak mencapai titik masuk utama.

Jadi tebakan saya adalah, entah bagaimana saya telah membuat masalah tautan dalam proyek tersebut. Aku hanya tidak tahu bagaimana cara melepaskan binatang itu.

Jadi pertanyaan saya, bagaimana saya bisa mengatasi kesalahan yang terjadi sebelum titik masuk utama tercapai. Bagaimana saya bisa menemukan kemungkinan ketergantungan melingkar yang ada.

Dan hanya untuk "bersenang-senang": Mengapa demi Tuhan ia dibangun dan dijalankan pada x86 tetapi tidak pada ppc.

Ya, saya tahu ini hanya sedikit informasi yang benar-benar membantu, tetapi saya menanyakan arah, semacam itu. Karena saya harus menghadapi masalah ini beberapa kali.


person MDeero    schedule 05.07.2016    source sumber
comment
Tampaknya rantai alat PPC atau lebih tepatnya kompilernya tidak tahu cara menangani variabel statis yang dideklarasikan setelah penggunaan (di kelas yang sama). Sedangkan kompiler x86 tidak mengalami masalah dalam mengurai masukan tersebut. (Versi kompiler yang berbeda, PPC ini adalah v4.0.X sedangkan x86 berada di 5.X.X.)   -  person MDeero    schedule 06.07.2016
comment
Untuk menemukan kesalahan yang saya lakukan: Sesuai Target: gdb mogok/aplikasi dan kemudian lihat bingkainya, di suatu tempat ada bingkai __static_initialization_and_destruction_0, yang seharusnya mengarahkan Anda ke file dan baris yang menggunakan variabel statis yang belum dideklarasikan. Core dump tidak berguna dalam situasi ini, karena dump tidak dapat mengakses variabel PC. Itu tidak akan menampilkan informasi apa pun kepada Anda (jadi sepertinya, mungkin saya salah menggunakan gdb (tidak sepenuhnya).   -  person MDeero    schedule 06.07.2016


Jawaban (1)


Mengapa demi Tuhan itu dibangun dan dijalankan pada x86 tetapi tidak pada ppc.

Ada sejuta kemungkinan penyebabnya, mulai dari rantai alat yang rusak, bug di libc, hingga pemanggilan rantai alat yang salah.

aku menanyakan arah

Anda harus mulai dengan mengkompilasi sumber ini:

int main() { return 0; }

dan memverifikasi bahwa itu berfungsi (ini memverifikasi kewarasan rantai alat dasar). Jika ya, Anda memperluasnya untuk mencetak sesuatu. Kemudian kompilasi dengan flag yang sama persis dengan yang Anda gunakan di proyek sebenarnya.

Jika semuanya sudah beres, Anda dapat menjalankan proyek sebenarnya di bawah strace dan/atau GDB dan melihat apakah Anda memahami di mana kerusakan itu terjadi. Jika tidak, edit pertanyaan Anda dengan keluaran dari alat, dan seseorang mungkin dapat menebak dengan lebih baik.

Pembaruan:

Tampaknya rantai alat PPC atau lebih tepatnya kompilernya tidak tahu cara menangani variabel statis yang dideklarasikan setelah penggunaan

Jika itu benar, Anda akan mendapatkan kesalahan kompilasi. Anda tidak melakukannya, jadi ini salah.

Sesuai Target: "gdb crash/app" dan kemudian lihat bingkainya, di suatu tempat ada bingkai "__static_initialization_and_destruction_0", yang seharusnya mengarahkan Anda ke file dan baris yang menggunakan variabel statis yang belum dideklarasikan.

Masalah nyata Anda kemungkinan besar adalah ini: urutan konstruksi variabel global (atau kelas-statis) dalam unit terjemahan yang berbeda (yaitu file sumber yang berbeda) tidak ditentukan (dan biasanya berlawanan antara x86_64 dan ppc). Jika Anda memiliki dua global seperti itu dalam file yang berbeda (misalnya A dan B), dan jika konstruktor Bs bergantung pada A yang telah dibuat, maka program Anda akan bekerja dengan baik pada platform tempat A dibuat sebelum B, namun akan mogok pada platform tempat B dicoba untuk dibangun sebelum A.

person Employed Russian    schedule 05.07.2016
comment
Ini menunjuk ke arah yang benar, sedikit menjelaskan bagaimana caranya, bagaimanapun, masalah sebenarnya dijelaskan dalam komentar pada pertanyaan saya. - person MDeero; 06.07.2016
comment
@MDeero Saya telah memperbarui jawabannya. Perihal: sedikit penjelasan -- Anda tidak memberikan informasi apa pun untuk mengetahui harus mulai menjelaskan apa pun. - person Employed Russian; 06.07.2016
comment
Serius, ini seperti yang saya jelaskan! Anda tidak dapat mengoreksi saya pada sesuatu yang baru saja saya saksikan, satu-satunya hal yang saya lakukan untuk menghilangkan kesalahan adalah memindahkan baris deklarasi variabel statis sebelum digunakan (dalam deklarasi variabel statis lain) di file sumber yang SAMA . DAN YA, saya sama tertipunya dengan Anda, saya mengira ini akan menghasilkan kesalahan kompilasi, ternyata tidak. Sebaliknya itu tidak berjalan. (Saya kira saya juga bisa menghilangkan kesalahan dengan memperbarui kompiler, tetapi karena ini kompilasi silang, saya tidak ingin mengacaukan apa pun di sana) - person MDeero; 06.07.2016
comment
@MDeero Anda mungkin masih salah. Memindahkan deklarasi ke atas juga akan mengubah urutan konstruksi sehubungan dengan variabel lain yang dideklarasikan dalam file yang sama. Bagaimanapun, penjelasan Anda tidak masuk akal, sehingga kecil kemungkinannya benar. - person Employed Russian; 06.07.2016
comment
cmake versi 3.2.2; GNU Buat 3.81; CROSS_COMPILE: powerpc-poky-linux-gnuspe-g++ (GCC) 4.8.1; LOCAL_COMPILE: g++ (Ubuntu 5.2.1-22ubuntu2) 5.2.1 20151010... jika ingin mengujinya, yang gagal adalah kompiler rantai alat ppc, yang sepertinya gagal menangani perintah deklarasi - person MDeero; 06.07.2016