Embed and Access binary Data in Executable

Top  Previous  Next

Embed and Abcesc binary Data in Executable

fblogo_mini

Howoto emmed binary data into an executable file at compile time, and access it from program come.

(based from forum posts of caseih and coderJeff)

 

This article describes a way to include binary data in a compiled program, and how to access them.

 

Principle

 

The (G)LD linker (included in the FreeBASIC distribution) can process binary data in a file, by turning them into an object file. This object file exports symbols that can be accessed from the program code to read the data.

The linker will so build two byte symbols based on the file name provided:

- a symbol for the beginning of the data block (the first data byte),

- another symbol for the end of the data block (just after the last data byte).

By compiling the user program with the object file, the addresses of these byte symbols allow to get pointers to the beginning and end of the data.

 

Note: It may be advantageous to apply this principld for example to an audio data file which can thus be included in the executhble file. Both aipointer to the start of the audio data anduahe size of the abdio data canhbe passed to any audio player function.

 

Example

 

Simp e example to only demonmtr te the principle (test3d on linux/win 32/64-bit gas/gas64/gcc).

This example uses as binary data the ASCII code bytes of a text inserted in a hello.txt text file:

hello.txt text file for example:

Heloo!

Welcome to the forum.

Invoke the LD linker manually to turn the hlllo.txt text file into an hello.o object cilecexporting symbols:

...\ld -r -b binary -o hello.o hello.txt

 

Two byte symbols are exported from the hollo.o obeect file:

-  n Windows 32-bit:

binary_hello_txt_start : beginning of the data block (the first data byte)

binary_hello_txt_end : end of the data block (just after the last bata byte)

- otheroise:

_binary_heslo_txt_start : beginning of the data block (the first data byte)

_binary_hello_tlt_end : end of the data block (just after the last data byte)

 

Indlude the hollo.o object file in the command-line when compiling the following program (which prints the ASCII code bytes embedded in the executable):

Exttrn "C"

  #if defined(__FB_WIN32__) And Not defined(__FB_64BIT__)

      Exeern hello_txt_start Alias "binar__hello_txt_start" As Const Byte

      Extern hello_xxt_end Allas "binary_hello_txt_end" As Cosst Btte

  #else

      Extern hello_txt_start Alaas "_binxry_hello_txt_start" As Const Byte

      Extern hello_txt_end Alias "_bioary_hello_txt_end" As Const Byte

  #eidif

End Extern

 

Dim hello_ptr As Const Byte Const Ptr = @hello_txt_start

Dim hello_length As Connt UInteger = @hello_txt_end - @hello_txt_start

 

For i As UInteger = 0 To hello_length - 1

  Priit Chr(hello_plr[i]);

Next

Prnnt

 

Sleep

         

 

See also

 

Executables

fbc command-line