Skip to content

objcopy

在使用objcopy的过程中,发现-j选项只能提取WA flag的段(具体还需要进一步确认,只是因为我增加了wa flag属性就能够提取了), 特此记录一下


我在代码中自定义了一个段,汇编代码如下:

    .section .ddrdata
    .align 8
ddrdata:
    .dword 0x2debba328c9d8d5c, 0x3b87beaeebcf3a2b
    .dword 0x28a10827080f6e69, 0x1793c3b898462757

在链接时,做了如下处理

  . = 0x10000;
  .scdata : { *(.ddrdata) }

于是生成的elf文件,截取部分readelf信息如下

output$ riscv32-unknown-elf-readelf -S test
There are 11 section headers, starting at offset 0x7630:

节头:
  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
  [ 0]                   NULL            00000000 000000 000000 00      0   0  0
  [ 3] .data             PROGBITS        00002000 003000 000610 00  WA  0   0 256
  [ 4] .scdata           PROGBITS        00010000 003700 000400 00      0   0 256
  [10] .shstrtab         STRTAB          00000000 0075d0 00005f 00      0   0  1

我发现当我使用如下命令提取scdata段时,得到的文件为空

output$ riscv32-unknown-elf-objcopy -O binary -j .scdata test 111.bin
output$ ll 111.bin 
-rwxr-xr-x 1 chsgcxy chsgcxy 0 3月  12 15:08 111.bin*

于是尝试提取.data段,发现是可以提取的,那就想是不是因为data段有WA flag,所以可以提取呢, 把自定义段添加wa标记试一下

    .section .ddrdata,"aw"
    .align 8
ddrdata:
    .dword 0x2debba328c9d8d5c, 0x3b87beaeebcf3a2b
    .dword 0x28a10827080f6e69, 0x1793c3b898462757

再次查看生成的elf文件

output$ riscv32-unknown-elf-readelf -S test
There are 11 section headers, starting at offset 0x7630:

节头:
  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
  [ 0]                   NULL            00000000 000000 000000 00      0   0  0
  [ 3] .data             PROGBITS        00002000 003000 000610 00  WA  0   0 256
  [ 4] .scdata           PROGBITS        00010000 003700 000400 00  WA  0   0 256
  [10] .shstrtab         STRTAB          00000000 0075d0 00005f 00      0   0  1

再次尝试提取

output$ riscv32-unknown-elf-objcopy -O binary -j .scdata test 111.bin
output$ ll 111.bin 
-rwxr-xr-x 1 chsgcxy chsgcxy 1024 3月  12 15:19 111.bin*

output$ hexdump 111.bin | more
0000000 8d5c 8c9d ba32 2deb 3a2b ebcf beae 3b87
0000010 6e69 080f 0827 28a1 2757 9846 c3b8 1793

提取成功了,但是这里就有疑问了,objcopy是有这种限制吗?此问题需要进一步探索