Jumat, 11 November 2016

Cara Include / Embed File Ke Dalam Program Dengan GCC


Kita bisa memasukkan file bersama program, lalu file tersebut dapat diakses layaknya variabel, lho. Jika belum pernah coba trik ini, yuk, baca lebih lanjut.

Saat kita memiliki resource dalam jumlah besar yang harus diolah, kita biasanya cenderung menyimpannya dalam sebuah file. Program akan membuka file tersebut dengan fopen(), membacanya dengan fread(), memprosesnya, dan terakhir, menutupnya dengan fclose(). Terlalu merepotkan apabila file ini bersifat statis dan tidak perlu untuk diubah-ubah lagi. Error juga bisa terjadi apabila ternyata file tersebut tidak sengaja dihapus oleh pengguna.

Daripada membuatnya sebagai sebagai file, bagaimana jika kita menggabungkan resource ini dengan program? pasti akan lebih simpel tentunya. Yuk, kita ikuti langkahnya.
Pertama, buat sampel teks, katakanlah contoh.txt.

lorem ipsum


Buat contoh.txt menjadi object dengan perintah berikut.

ld -b binary contoh.txt --no-leading-underscore -o contoh.o

Kok ld? katanya gcc? hehe. Iya memang. Yang kita gunakan adalah LD, bukan GCC. Program ini adalah linker untuk gcc. Jadi, jika anda memiliki GCC, pasti punya juga program LD.
Argumen -b binary menginstruksikan LD untuk mengeluarkan output dalam bentuk binary object, lalu argumen --no-leading-underscore akan mencegah ld untuk menghasilkan simbol dengan awalan underscore, dan terakhir -o contoh.o untuk memberikan nama output yang dikehendaki.

Kemudian buat program untuh mencetak teks tadi. Saya akan memberinya nama print_contoh.c.

#include <stdio.h>

extern char binary_contoh_txt_start[];
extern char binary_contoh_txt_end[];

int main(){
    printf(binary_contoh_txt_start);
}

Loh, apa itu binary_contoh_txt_start dan binary_contoh_txt_end?
Yap, benar. Kedua simbol ini dihasilkan otomatis oleh LD. Formatnya adalah binary_nama_file_start yang menunjuk ke bagian awal data, dan binary_nama_file_end yang menunjuk ke bagian ekor dari data. Jika kita tidak menggunakan argumen --no-leading-underscore saat menggunakan ld, simbol yang dihasilkan biasanya otomatis berganti nama dengan underscore di depannya. Itulah mengapa sebelumya argumen tersebut dipakai. Tanpa argumen tersebut kita harus mengakes binary_nama_file... sebagai _binary_nama_file....

Kita bisa mengakses teks yang kita buat dengan binary_contoh_txt_start. Kemudian, jika kita ingin mengetahui ukuran data yang telah di embed, hitung saja dengan binary_contoh_txt_end - binary_contoh_txt_start.

Untuk membangun program ini, gunakan command berikut.
compile print_contoh.c lalu build dengan contoh.o:
gcc -c print_contoh.c -o print_contoh.o
gcc contoh.o print_contoh.o -o print_contoh.exe

Atau, bisa dilakukan dalam satu perintah, seperti ini.
gcc contoh.o print_contoh.c -o print_contoh.exe

Hasilnya?

Belum pernah memikirkan ini sebelumnya? Kalau iya, ayo ikuti saya bilang: "WOW" :D
Sekian dari saya, semoga bermanfaat.
Load disqus comments

0 comments