Posting blog itu sangat tidak akurat.
Sejauh yang saya tahu, perubahan C ++ ABI telah diperkenalkan dengan setiap rilis utama GCC (yaitu yang memiliki komponen nomor versi pertama atau kedua yang berbeda).
Tidak benar. Satu-satunya perubahan C ++ ABI yang diperkenalkan sejak GCC 3.4 telah kompatibel dengan versi sebelumnya, yang berarti C ++ ABI telah stabil selama hampir sembilan tahun.
Lebih buruk lagi, sebagian besar distribusi Linux utama menggunakan cuplikan GCC dan / atau menambal versi GCC mereka, sehingga hampir tidak mungkin untuk mengetahui dengan tepat versi GCC apa yang mungkin Anda hadapi saat mendistribusikan biner.
Perbedaan antara versi GCC yang ditambal dari distribusi kecil, dan bukan ABI yang berubah, misalnya Fedora 4.6.3 20120306 (Red Hat 4.6.3-2) adalah ABI yang kompatibel dengan rilis FSF 4.6.x upstream dan hampir pasti dengan semua 4.6. x dari distro lain.
Pada pustaka runtime GNU / Linux GCC menggunakan versi simbol ELF sehingga mudah untuk memeriksa versi simbol yang dibutuhkan oleh objek dan pustaka, dan jika Anda memiliki libstdc++.so
yang menyediakan simbol-simbol itu, itu akan berfungsi, tidak masalah jika itu versi tambalan yang sedikit berbeda dari versi lain distro Anda.
tetapi tidak ada kode C ++ (atau kode apa pun yang menggunakan dukungan runtime C ++) yang dapat ditautkan secara dinamis jika ini ingin bekerja.
Ini juga tidak benar.
Meskipun demikian, menautkan ke secara statis libstdc++.a
adalah salah satu opsi untuk Anda.
Alasan mengapa ini mungkin tidak berfungsi jika Anda secara dinamis memuat pustaka (menggunakan dlopen
) adalah karena simbol libstdc ++ yang bergantung padanya mungkin tidak diperlukan oleh aplikasi Anda saat Anda (secara statis) menautkannya, jadi simbol itu tidak akan ada dalam file yang dapat dieksekusi. Itu dapat diselesaikan dengan secara dinamis menautkan pustaka bersama ke libstdc++.so
(yang merupakan hal yang benar untuk dilakukan jika bergantung padanya.) Interposisi simbol ELF berarti simbol yang ada dalam eksekusi Anda akan digunakan oleh pustaka bersama, tetapi yang lain tidak hadir di executable Anda akan ditemukan di mana pun libstdc++.so
ia tertaut. Jika aplikasi Anda tidak menggunakan dlopen
Anda tidak perlu peduli tentang itu.
Opsi lain (dan yang saya sukai) adalah menerapkan yang lebih baru di libstdc++.so
samping aplikasi Anda dan memastikannya ditemukan sebelum sistem default libstdc++.so
, yang dapat dilakukan dengan memaksa penaut dinamis untuk mencari di tempat yang tepat, baik menggunakan $LD_LIBRARY_PATH
variabel lingkungan saat dijalankan- waktu, atau dengan mengatur RPATH
di eksekusi pada link-time. Saya lebih suka menggunakan RPATH
karena tidak bergantung pada lingkungan yang disetel dengan benar agar aplikasi berfungsi. Jika Anda menghubungkan aplikasi Anda dengan '-Wl,-rpath,$ORIGIN'
(perhatikan tanda kutip tunggal untuk mencegah shell mencoba untuk memperluas $ORIGIN
) maka eksekusi akan memiliki RPATH
dari $ORIGIN
yang menceritakan linker dinamis untuk mencari shared library di direktori yang sama dengan eksekusi itu sendiri. Jika Anda menempatkan yang lebih barulibstdc++.so
dalam direktori yang sama dengan yang dapat dieksekusi, itu akan ditemukan pada waktu proses, masalah terpecahkan. (Pilihan lain adalah memasukkan file yang dapat dieksekusi /some/path/bin/
dan libstdc ++ yang lebih baru. Jadi /some/path/lib/
dan menautkan dengan '-Wl,-rpath,$ORIGIN/../lib'
atau lokasi tetap lainnya yang relatif terhadap yang dapat dieksekusi, dan mengatur RPATH relatif ke $ORIGIN
)
-static-libstdc++
opsi, Anda hanya akan menggunakan-static