Panduan c++filt: Membaca Simbol Mangling C++ di Linux

Pengantar: Memahami Kebutuhan Demangling C++

Saat menelusuri file biner atau melakukan debugging aplikasi C++ di Linux, pengembang kerap menemukan string simbol yang terlihat acak dan sulit dipahami manusia. Rangkaian karakter aneh tersebut sejatinya merupakan hasil dari proses name mangling—mekanisme yang diterapkan kompilator C++ untuk membedakan signature fungsi akibat fitur function overloading serta penataan namespace. Panduan teknis ini mengulas tuntas cara kerja utilitas c++filt dalam mendekode simbol ter-mangle kembali ke deklarasi fungsi aslinya, lengkap dengan skenario implementasi langsung di terminal.

Menyiapkan Utilitas binutils dan Membedah Simbol Tunggal

Untuk menyediakan perkakas biner dasar termasuk utilitas c++filt, pasang paket yang dibutuhkan via manajer paket dengan mengeksekusi apt-get update -qq && apt-get install -y binutils.

Instalasi paket binutils

Pastikan paket telah terpasang dengan benar dan periksa versinya melalui perintah c++filt --version | head -n 2.
Secara fungsional, c++filt bertindak sebagai penerjemah balik (demangler) yang mentransformasikan identitas terenkripsi kompilator C++ menjadi representasi fungsi, kelas, maupun parameter yang mudah dibaca oleh programmer.
⚙️ [Parameter Kunci]

-_, --strip-underscore : Membuang karakter garis bawah awal sebelum proses demangling berjalan.
-n, --no-strip-underscore : Mempertahankan garis bawah di awal simbol tanpa memotongnya.
-p, --no-params : Menyembunyikan rincian argumen/parameter dan hanya menampilkan nama fungsinya.
-t, --types : Mengaktifkan translasi tipe data internal di samping simbol fungsi.
-s, --format : Memilih skema spesifik format demangling berdasarkan standar ABI kompilator tertentu.

Verifikasi versi c++filt

Uji dekode simbol dasar tanpa parameter menggunakan perintah c++filt _Z1fv.
Utilitas ini langsung memecahkan kode tersebut menjadi signature fungsi murni f().

Mendekode fungsi sederhana

Untuk mengurai simbol yang mengemas struktur hierarki namespace beserta tipe data argumen, jalankan c++filt _ZN4Math3addEii.
Hasil decoding menampilkan relasi lingkup Math::add(int, int) secara gamblang, mengekspos namespace induk sekaligus kedua parameter bertipe integer.

Mendekode namespace dan argumen fungsi

Eksperimen Name Mangling: Integrasi Kompilator dan Perintah nm

Konfigurasikan lingkungan kompilasi C++ di sistem Ubuntu dengan menjalankan apt-get update -qq && apt-get install -y build-essential.

Menyiapkan build-essential

Buatlah sebuah modul C++ sederhana yang mengimplementasikan overloading fungsi di dalam ruang lingkup namespace dengan mengeksekusi cat << 'EOF' > /tmp/demo.cpp.

Membuat file sumber C++

Kompilasi berkas C++ tersebut menjadi file objek siap-link menggunakan perintah g++ -c /tmp/demo.cpp -o /tmp/demo.o.

Mengompilasi source code ke file objek

Untuk menginspeksi tabel simbol hasil bentukan kompilator pada file objek, jalankan nm /tmp/demo.o | grep add.
Perhatikan bahwa fungsi add telah mengalami perubahan nama menjadi _ZN10Calculator3addEii dan _ZN10Calculator3addEdd demi membedakan tipe parameter int dan double.

Menganalisis tabel simbol dengan nm

Alihkan keluaran perintah nm ke utilitas demangler secara berantai dengan menjalankan nm /tmp/demo.o | c++filt | grep add.
Pipa pemrosesan ini secara otomatis menerjemahkan kembali simbol-simbol rumit tadi menjadi penamaan fungsi yang jelas, yakni Calculator::add(int, int) serta Calculator::add(double, double).

Mengurai simbol biner secara dinamis via pipeline

Menangani Simbol Template Kompleks Melalui Mekanisme Pipa

Tipe data generik dari STL sering kali menghasilkan signature biner yang sangat panjang. Buat skenario pengujian template class melalui cat << 'EOF' > /tmp/template_demo.cpp.

Membuat source code template STL

Lakukan kompilasi berkas template tersebut menjadi artefak biner dengan g++ -c /tmp/template_demo.cpp -o /tmp/template_demo.o.

Kompilasi kelas template ke objek biner

Telusuri simbol yang terkait dengan fungsi anggota print melalui nm /tmp/template_demo.o | grep print.
Kombinasi std::vector dan std::string menghasilkan simbol mangled berlapis yang nyaris mustahil dibaca secara visual tanpa alat bantu.

Menampilkan simbol mentah template STL

Gunakan kekuatan pipeline Unix untuk menguraikan kembali hierarki template tersebut dengan menjalankan nm /tmp/template_demo.o | c++filt | grep print.
Output yang dihasilkan merestorasi seluruh struktur tipe data aslinya secara transparan, memperlihatkan instansiasi kelas template beserta parameternya secara presisi.

Demangling struktur template kompleks

Optimalisasi Parsing: Opsi -p dan Otomatisasi Log Error

Untuk membedah signature fungsi secara menyeluruh termasuk rincian tipe argumennya, jalankan c++filt _ZN10Calculator3addEii.
Perintah standar ini menghasilkan output lengkap yang memuat nama kelas, fungsi, dan daftar tipe parameter (int, int).

Mendekode signature lengkap

Jika fokus analisis hanya tertuju pada identitas fungsi tanpa membutuhkan daftar parameternya, gunakan opsi ringkas c++filt -p _ZN10Calculator3addEii.
Parameter -p menyaring argumen fungsi dan menyajikan representasi bersih berupa Calculator::add.

Menampilkan nama fungsi tanpa parameter

Aktifkan interpretasi tipe secara eksplisit dengan memasukkan opsi -t lewat c++filt -t _ZN10Calculator3addEii.
Mode ini memastikan integritas struktur simbol tetap terpelihara dan menghasilkan deklarasi Calculator::add(int, int).

Dekode simbol dengan mode tipe data

Dalam skenario operasional nyata, c++filt dapat membaca teks log utuh dan hanya mengonversi bagian simbol C++ tanpa merusak kalimat di sekitarnya, seperti dicontohkan melalui echo 'Fatal error in _ZN10Calculator3addEii at runtime' | c++filt.
Pola integrasi ini sangat efektif untuk mengotomatisasi pemfilteran berkas stack trace dan log error produksi agar dapat dibaca langsung oleh tim pengembang.

Parsing otomatis simbol mangled dalam pesan log

Mekanisme name mangling merupakan pilar penting dalam kompilator C++ modern untuk mengelola fitur-fitur berorientasi objek di level biner. Berbekal utilitas c++filt, tugas menelusuri simbol kriptik saat memecahkan masalah tautan (linker errors) atau menganalisis crash dump di Linux kini menjadi jauh lebih cepat dan terstruktur.