Incorporare blob binari usando gcc mingw

Sto cercando di incorporare blob binari in un file exe. Sto usando mingw gcc.

Faccio il file object in questo modo:

ld -r -b binary -o binary.o input.txt 

Osservo quindi l’output objdump per ottenere i simboli:

 objdump -x binary.o 

E dà i simboli chiamati:

 _binary_input_txt_start _binary_input_txt_end _binary_input_txt_size 

Allora provo ad accedervi nel mio programma C:

 #include  #include  extern char _binary_input_txt_start[]; int main (int argc, char *argv[]) { char *p; p = _binary_input_txt_start; return 0; } 

Quindi compilo in questo modo:

 gcc -o test.exe test.c binary.o 

Ma ottengo sempre:

 undefined reference to _binary_input_txt_start 

Qualcuno sa cosa sto sbagliando?

Nel tuo programma C rimuovi il trattino basso principale:

 #include  #include  extern char binary_input_txt_start[]; int main (int argc, char *argv[]) { char *p; p = binary_input_txt_start; return 0; } 

I compilatori C spesso (sempre?) Sembrano anteporre un underscore a nomi extern . Non sono del tutto sicuro del perché – suppongo che ci sia del vero in questa affermazione dell’articolo di wikipedia che

Era prassi comune per i compilatori C anteporre un segno di sottolineatura principale a tutti gli identificatori del programma di ambito esterno per evitare conflitti con i contributi del supporto del linguaggio di runtime

Ma mi sembra che se i caratteri di sottolineatura fossero stati inseriti in tutti gli extern, allora non stai davvero partizionando molto lo spazio dei nomi. Ad ogni modo, questa è una domanda per un altro giorno, e il fatto è che i caratteri di sottolineatura vengono aggiunti.

L’ho provato su Linux (Ubuntu 10.10).

  1. Resouce file:
    input.txt

  2. gcc (Ubuntu / Linaro 4.4.4-14ubuntu5) 4.4.5 [genera un eseguibile ELF, per Linux]
    Genera il simbolo _binary__input_txt_start .
    Accetta il simbolo _binary__input_txt_start (con sottolineatura).

  3. i586-mingw32msvc-gcc (GCC) 4.2.1-sjlj (mingw32-2) [genera PE eseguibile, per Windows]
    Genera il simbolo _binary__input_txt_start .
    Accetta il simbolo binary__input_txt_start (senza sottolineatura).

Dalla pagina man di ld :

–leading-sottolineatura

–no-leader di sottolineatura

Per la maggior parte dei target, il prefisso-simbolo predefinito è un trattino basso e viene definito nella descrizione dell’objective. Con questa opzione è ansible disabilitare / abilitare il prefisso del simbolo di sottolineatura predefinito.

così

 ld -r -b binary -o binary.o input.txt --leading-underscore 

dovrebbe essere una soluzione

Apparentemente questa caratteristica non è presente nel ld di OSX, quindi devi farlo in modo totalmente diverso con un flag gcc personalizzato che hanno aggiunto, e non puoi fare riferimento ai dati direttamente, ma devi fare qualche inizializzazione del runtime per ottenere l’indirizzo.

Quindi potrebbe essere più portabile creare un file sorgente di assemblatore che includa il file binario in fase di compilazione, a questa risposta .