How to extract only the raw contents of an ELF section?

后端 未结 4 400
说谎
说谎 2020-12-01 04:16

I\'ve tried the following, but the resulting file is still an ELF and not purely the section content.

$ objcopy --only-section=  &l         


        
相关标签:
4条回答
  • 2020-12-01 04:54

    objcopy --dump-section

    Introduced in Binutils 2.25, and achieves a similar effect to -O binary --only-section.

    Usage:

    objcopy --dump-section .text=output.bin input.o
    

    https://sourceware.org/binutils/docs-2.25/binutils/objcopy.html documents it as:

    --dump-section sectionname=filename

    Place the contents of section named sectionname into the file filename, overwriting any contents that may have been there previously. This option is the inverse of --add-section. This option is similar to the --only-section option except that it does not create a formatted file, it just dumps the contents as raw binary data, without applying any relocations. The option can be specified more than once.

    Minimal runnable example

    main.S

    .data
        .byte 0x12, 0x34, 0x56, 0x78
    .text
        .byte 0x9A, 0xBC, 0xDE, 0xF0
    

    Assemble:

    as -o main.o main.S
    

    Extract data:

    objcopy --dump-section .data=data.bin main.o
    hd data.bin
    

    Output:

    00000000  12 34 56 78                                       |.4Vx|
    00000004
    

    Extract text:

    objcopy --dump-section .text=text.bin main.o
    hd text.bin
    

    Output:

    00000000  9a bc de f0                                       |....|
    00000004
    

    Tested in Ubuntu 18.04 amd64, Binutils 2.30.

    0 讨论(0)
  • 2020-12-01 05:03

    Use the -O binary output format:

    objcopy -O binary --only-section=.text foobar.elf foobar.text
    

    Just verified with avr-objcopy and an AVR ELF image's .text section.

    Note that if, as Tim points out below, your section doesn't have the ALLOC flag, you may have to add --set-section-flags .text=alloc to be able to extract it.

    0 讨论(0)
  • 2020-12-01 05:07

    Dump all sections in separate files.

    readelf -a filename|grep "NULL\|LOAD"| (x=0;while read a;do echo "$x $a"|awk '{print "dd if=143 of=filename.section."$1" bs=1 skip=$((" $3")) count=$(("$6"))"}';let x=x+1;done)|bash
    
    0 讨论(0)
  • 2020-12-01 05:17

    Rather inelegant hack around objdump and dd:

    IN_F=/bin/echo
    OUT_F=./tmp1.bin
    SECTION=.text
    
    objdump -h $IN_F |
      grep $SECTION |
      awk '{print "dd if='$IN_F' of='$OUT_F' bs=1 count=$[0x" $3 "] skip=$[0x" $6 "]"}' |
      bash
    

    The objdump -h produces predictable output which contains section offset in the elf file. I made the awk to generate a dd command for the shell, since dd doesn't support hexadecimal numbers. And fed the command to shell.

    In past I did all that manually, without making any scripts, since it is rarely needed.

    0 讨论(0)
提交回复
热议问题