linking arbitrary data using GCC ARM toolchain

后端 未结 3 1034
北荒
北荒 2020-12-02 23:59

I want to link in raw binary data. I\'d like to either put it at a particular address, or have it link to a symbol (char* mydata, for instance) I have defined in code. Sinc

3条回答
  •  暗喜
    暗喜 (楼主)
    2020-12-03 00:33

    The following example works for me:

    $ dd if=/dev/urandom of=binblob bs=1024k count=1
    $ objcopy -I binary -O elf32-little binblob binblob.o
    $ file binblob.o
    binblob.o: ELF 32-bit LSB relocatable, no machine, version 1 (SYSV), not stripped
    $ nm  -S -t d binblob.o
    0000000001048576 D _binary_binblob_end
    0000000001048576 A _binary_binblob_size
    0000000000000000 D _binary_binblob_start
    

    I.e. no need to specify the BFD arch for binary data (it's only useful / necessary for code). Just say "the input is binary", and "the output is ...", and it'll create you the file. Since pure binary data isn't architecture-specific, all you need to tell it is whether the output is 32bit (elf32-...) or 64bit (elf64-...), and whether it's little endian / LSB (...-little, as on ARM/x86) or big endian / MSB (...-big, as e.g. on SPARC/m68k).

    Edit: Clarification on the options for objcopy:

    • the usage of the -O ... option controls:
      • bit width (whether the ELF file will be 32-bit or 64-bit)
      • endianness (whether the ELF file will be LSB or MSB)
    • the usage of the -B ... option controls the architecture the ELF file will request

    You have to specifiy the -O ... but the -B ... is optional. The difference is best illustrated by a little example:

    $ objcopy -I binary -O elf64-x86-64 foobar foobar.o
    $ file foobar.o
    foobar.o: ELF 64-bit LSB relocatable, no machine, version 1 (SYSV), not stripped
    
    $ objcopy -I binary -O elf64-x86-64 -B i386 foobar foobar.o
    $ file foobar.o
    foobar.o: ELF 64-bit LSB relocatable, AMD x86-64, version 1 (SYSV), not stripped

    I.e. just the output format specifier elf64-x86-64 doesn't tie the generated binary to a specific architecture (that's why file says no machine). The usage if -B i386 does so - and in that case, you're told this is now AMD x86-64.

    The same would apply to ARM; -O elf32-little vs. -O elf32-littlearm -B arm is that in the former case, you end up with a ELF 32-bit LSB relocatable, no machine, ... while in the latter, it'll be an ELF 32-bit LSB relocatable, ARM....

    There's some interdependency here as well; you have to use -O elf{32|64}- (not the generic elf{32|64}-{little|big}) output option to be able to make -B ... recognized.

    See objcopy --info for the list of ELF formats / BFD types that your binutils can deal with.

提交回复
热议问题