Incorporando blobs binários usando gcc mingw

Eu estou tentando incorporar blobs binários em um arquivo exe. Eu estou usando o mingw gcc.

Eu faço o arquivo object assim:

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

Eu então procuro a saída do objdump para obter os símbolos:

 objdump -x binary.o 

E dá símbolos chamados:

 _binary_input_txt_start _binary_input_txt_end _binary_input_txt_size 

Eu então tento acessá-los no meu programa C:

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

Então eu compilo assim:

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

Mas eu sempre recebo:

 undefined reference to _binary_input_txt_start 

Alguém sabe o que estou fazendo errado?

Em seu programa C, remova o sublinhado principal:

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

Compiladores C frequentemente (sempre?) Parecem preceder um sublinhado para nomes extern . Eu não tenho certeza do porque isso é – eu assumo que há alguma verdade na alegação deste artigo da wikipedia de que

Era prática comum para os compiladores C impor um sublinhado principal a todos os identificadores de programa de escopo externos para evitar conflitos com contribuições do suporte a idiomas de tempo de execução

Mas parece-me que, se os sublinhados foram prefixados para todos os externos, então você não está realmente particionando muito o namespace. De qualquer forma, essa é uma pergunta para outro dia, e o fato é que os sublinhados são adicionados.

Eu testei no Linux (Ubuntu 10.10).

  1. Arquivo de resources:
    input.txt

  2. gcc (Ubuntu / Linaro 4.4.4-14ubuntu5) 4.4.5 [gera executável ELF, para Linux]
    Gera o símbolo _binary__input_txt_start .
    Aceita o símbolo _binary__input_txt_start (com sublinhado).

  3. i586-mingw32msvc-gcc (GCC) 4.2.1-sjlj (mingw32-2) [gera executável PE, para Windows]
    Gera o símbolo _binary__input_txt_start .
    Aceita o símbolo binary__input_txt_start (sem sublinhado).

Da ld man page :

–levante-sublinhado

–no-leading-underscore

Para a maioria dos alvos, o prefixo de símbolo padrão é um sublinhado e é definido na descrição do alvo. Por essa opção, é possível desabilitar / habilitar o prefixo de símbolo de sublinhado padrão.

assim

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

deve ser solução.

Aparentemente esse recurso não está presente no ld do OSX, então você tem que fazer isso de forma totalmente diferente com um sinalizador personalizado do gcc que eles adicionaram, e você não pode referenciar os dados diretamente, mas deve fazer alguma boot em tempo de execução para obter o endereço.

Portanto, pode ser mais portátil tornar-se um arquivo de origem do montador que inclua o binário no momento da compilation, à la this answer .