Menghapus pustaka C++ dari kode yang tidak diperlukan untuk suatu aplikasi [ditutup]

Saya memiliki aplikasi yang bergantung pada banyak perpustakaan. Saya membangun semuanya dari sumber di mesin ubuntu. Saya ingin menghapus fungsi/kelas apa pun yang tidak diperlukan oleh suatu aplikasi. Apakah ada alat untuk membantu hal itu?

P.S. Saya ingin menghapus kode sumber dari perpustakaan bukan hanya simbol dari file objek.


person Ashok Vishnoi    schedule 24.05.2018    source sumber
comment
Tampaknya mungkin, lihat di sini.   -  person Paul Sanders    schedule 24.05.2018
comment
Anda tidak perlu mengubah kode sumber untuk menghapus fungsi, metode, atau kelas yang tidak digunakan dari biner Anda. Jawaban saya dimaksudkan untuk menunjukkan kepada Anda bagaimana melakukannya dengan saklar kompiler sederhana. Tolong beri tahu saya jika ada yang memerlukan klarifikasi.   -  person Paul Sanders    schedule 25.05.2018
comment
Saya memahami maksud Anda dan menghargai bantuan Anda. Namun saya ingin mengoptimalkan perpustakaan sumber terbuka, tetapi saya tidak memerlukan fungsionalitas perpustakaan yang lengkap, jadi jika saya dapat menghapus kode sumber maka akan lebih mudah untuk mengoptimalkannya.   -  person Ashok Vishnoi    schedule 25.05.2018
comment
Mengapa lebih mudah untuk dioptimalkan? Apa yang saya tidak mengerti adalah mengapa Anda berpikir bahwa menghapus kode dari file sumber akan memberikan hasil yang berbeda jika kompiler dan linker melakukannya untuk Anda.   -  person Paul Sanders    schedule 25.05.2018
comment
Kode sumber aslinya sangat besar. (~200k LOC). Saya membutuhkan sekitar 20k LOC.   -  person Ashok Vishnoi    schedule 28.05.2018
comment
Apa itu LOC? Dan jika yang Anda maksud adalah ukuran biner Anda, coba tanda itu. Itu harus menghapus kode yang tidak dapat dijangkau dan mungkin itu yang Anda butuhkan. Meretas sumber perpustakaan sepertinya ide yang buruk - Anda hampir pasti akan merusak sesuatu.   -  person Paul Sanders    schedule 28.05.2018
comment
LOC-›Baris Kode Saya ingin menghapus kode yang tidak digunakan, mengoptimalkan kode, dan memeliharanya. Mempertahankan seluruh perpustakaan terlalu berat untuk fungsionalitas kecil.   -  person Ashok Vishnoi    schedule 28.05.2018
comment
Oh oke, saya tidak menyadari Anda sedang mempertimbangkan operasi radikal seperti itu, maaf. Saya pikir saya hanya akan menggunakan IDE yang layak. Milik saya memiliki banyak alat 'Intellisense' yang dapat membantu dalam hal itu.   -  person Paul Sanders    schedule 28.05.2018


Jawaban (3)


Utilitas strip standar dibuat khusus untuk ini.

person Chugaister    schedule 24.05.2018
comment
Itu hanya membuang simbol. OP (dan memang saya) ingin menghilangkan kode dari final executable yang tidak pernah dipanggil. - person Paul Sanders; 24.05.2018

Saya sekarang telah meneliti ini sedikit dalam konteks proyek saya sendiri dan memutuskan bahwa ini layak mendapat jawaban lengkap daripada sekadar komentar. Jawaban ini didasarkan pada rantai alat Apple di macOS (yang menggunakan dentang, bukan gcc), tapi menurut saya semuanya bekerja dengan cara yang hampir sama untuk keduanya.

Kuncinya adalah mengaktifkan 'pengoptimalan waktu tautan' saat membangun perpustakaan dan file yang dapat dieksekusi. Mekanismenya sebenarnya sangat sederhana - cukup berikan -flto ke gcc dan ld pada baris perintah. Ini memiliki dua efek:

  • Kode (fungsi/metode) dalam file objek atau arsip yang tidak pernah dipanggil dihilangkan dari eksekusi akhir.
  • Linker melakukan semacam optimasi yang dapat dilakukan oleh kompiler (seperti fungsi inlining), namun dengan pengetahuan yang melampaui batas-batas unit kompilasi.

Ini tidak akan membantu Anda jika Anda menautkan ke perpustakaan bersama, tetapi mungkin membantu jika perpustakaan bersama itu tertaut dengan perpustakaan (statis) lain yang berisi kode yang tidak pernah dipanggil oleh perpustakaan bersama.

Sisi positifnya, ini mengurangi ukuran eksekusi akhir saya sekitar 5%, dan ini membuat saya senang. YMMV.

Sisi negatifnya, ukuran file objek saya kira-kira dua kali lipat dan terkadang waktu tautan meningkat drastis (kira-kira sekitar 100 kali lipat). Lalu, jika saya tautkan kembali, jauh lebih cepat. Namun perilaku ini mungkin merupakan kekhasan rantai alat Apple. Mungkin ia menyembunyikan beberapa perantara bangunan di suatu tempat pada tautan pertama. Bagaimanapun, jika Anda hanya mengaktifkan opsi ini untuk versi rilis, hal ini tidak akan menjadi masalah besar.

Terdapat detail lebih lanjut mengenai rangkaian lengkap opsi baris perintah gcc yang mengontrol pengoptimalan di sini: https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html. Telusuri laman itu untuk flto untuk mempersempit penelusuran Anda.

Dan untuk melihat sekilas di balik layar, lihat: https://gcc.gnu.org/onlinedocs/gccint/LTO-Overview.html

Sunting:

Sedikit informasi lebih lanjut tentang waktu tautan. Tautan Apple membuat beberapa file besar di direktori bernama LTOCache saat Anda menautkan. Saya belum pernah melihat ini sebelumnya, jadi ini tampaknya merupakan perantara yang mempercepat tautan untuk kedua kalinya. Mengenai tautan awal saya yang sangat lambat, hal ini mungkin sebagian disebabkan oleh fakta bahwa, dalam kasus saya, tautan ini dibuat di server SMB. Tapi sekali lagi, CPU sudah maksimal jadi mungkin tidak.

person Paul Sanders    schedule 24.05.2018

Oke, sekarang setelah saya memahami persyaratan OP dengan lebih baik, saya punya jawaban lain untuk ini yang menurut saya mungkin lebih sesuai dengan kebutuhannya. Menurut saya cara mengatasi hal ini adalah dengan alat cakupan kode. Lagi pula, masalahnya adalah mengidentifikasi apa yang dapat Anda hilangkan dengan aman. Sebenarnya menghilangkannya itu mudah.

IDE saya (Visual Studio) memiliki salah satunya, tetapi menurut saya OP menggunakan gcc sehingga port panggilan pertama tampaknya adalah gcov. Ada sejumlah opsi komersial, tetapi harganya mahal. Ada juga postingan yang berpotensi berguna di sini.

Hal lain yang Anda butuhkan, tentu saja, adalah sebuah program yang melatih semua bagian perpustakaan yang ingin Anda simpan untuk memberi Anda laporan cakupan untuk dikerjakan, tapi sepertinya OP sudah memilikinya. IDE yang baik juga akan membantu karena membuat navigasi di sekitar kode menjadi lebih mudah. Di Visual Studio, menurut saya Lompat ke Definisi dan 'bookmark' yang cepat dan mudah menjadi fitur utama.

person Paul Sanders    schedule 28.05.2018
comment
Terima kasih. Itu memang membantu saya mengurangi ukurannya. Namun saya harus menghapus bagian kode yang tidak dieksekusi dan membuat kode untuk memeriksa apakah ada kesalahan kompilasi karena alat cakupan hanya menyediakan informasi runtime. Jadi jika suatu fungsi dipanggil dari bagian else dari pernyataan if..else dan saat eksekusi, bagian if dieksekusi. Meskipun fungsi tersebut terlihat tidak dijalankan dalam laporan cakupan, tidak mungkin untuk menghapusnya. - person Ashok Vishnoi; 03.06.2018
comment
Ya, itu masuk akal. Mungkin Anda dapat melangkah lebih jauh dan menghapus bagian else juga (Anda memang mengatakan ingin membuang sebanyak mungkin baris sumber). - person Paul Sanders; 03.06.2018