<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/55246>55246</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            llvm-objcopy missing padding between sections
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          Kimplul
      </td>
    </tr>
</table>

<pre>
    I have an elf file that I would like to turn into a raw binary, and I'm trying to allocate the `.bss` section directly in the binary. For some reason, there is a small gap between my `.text` and `.bss`, which is padded with some bytes when using GNU objcopy, but seemingly ignored when using llvm-objcopy.

To illustrate:
`riscv64-unknown-elf-objcopy -Obinary --set-section-flags .bss=alloc,load,contents --gap-fill 255 example.elf example.bin`

produces a raw binary ending in
```
...
00000240: ef00 e000 0100 e270 4274 2161 8280 2a86  .......pBt!a..*.
00000250: 2e85 0286 ffff ffff 0000 0000 0000 0000  ................
```

where `ffff ffff` is padding. (The actual value of the padding is irrelevant, I just used `ff` for demonstration purposes). The equivalent command with `llvm-objcopy`
`llvm-objcopy -Obinary --set-section-flags .bss=alloc,load,contents example.elf example.bin`

produces

```
...
00000240: ef00 e000 0100 e270 4274 2161 8280 2a86  .......pBt!a..*.
00000250: 2e85 0286 0000 0000 0000 0000            ............
```

For context, here's the `readelf` output for `example.elf`:

```
readelf --sections example.elf
There are 15 section headers, starting at offset 0x20d0:

Section Headers:
  [Nr] Name              Type             Address           Offset
       Size              EntSize          Flags  Link  Info  Align
  [ 0]                   NULL             0000000000000000  00000000
       0000000000000000  0000000000000000           0     0     0
  [ 1] .text             PROGBITS         0000000080080000  00001000
       0000000000000254  0000000000000000  AX       0     0     2
  [ 2] .bss              NOBITS           0000000080080258  00001254
       0000000000000008  0000000000000000  WA       0     0     8
  [ 3] .debug_info       PROGBITS         0000000000000000  00001254
       000000000000030e  0000000000000000           0     0     1
  [ 4] .debug_abbrev     PROGBITS         0000000000000000  00001562
       0000000000000187  0000000000000000           0     0     1
  [ 5] .debug_aranges    PROGBITS         0000000000000000  000016f0
       0000000000000060  0000000000000000           0     0     16
  [ 6] .debug_line       PROGBITS         0000000000000000  00001750
       0000000000000292  0000000000000000           0     0     1
  [ 7] .debug_str        PROGBITS         0000000000000000  000019e2
       00000000000001aa  0000000000000001  MS       0     0     1
  [ 8] .debug_line_str   PROGBITS         0000000000000000  00001b8c
       0000000000000098  0000000000000001  MS       0     0     1
  [ 9] .comment          PROGBITS         0000000000000000  00001c24
       0000000000000012  0000000000000001  MS       0     0     1
  [10] .riscv.attributes RISCV_ATTRIBUTE  0000000000000000  00001c36
       0000000000000039  0000000000000000           0     0     1
  [11] .debug_frame      PROGBITS         0000000000000000  00001c70
       00000000000000d0  0000000000000000           0     0     8
  [12] .symtab           SYMTAB           0000000000000000  00001d40
       0000000000000270  0000000000000018          13    17     8
  [13] .strtab           STRTAB           0000000000000000  00001fb0
       0000000000000080  0000000000000000           0     0     1
  [14] .shstrtab         STRTAB           0000000000000000  00002030
       000000000000009e  0000000000000000           0     0     1
Key to Flags:
  W (write), A (alloc), X (execute), M (merge), S (strings), I (info),
  L (link order), O (extra OS processing required), G (group), T (TLS),
  C (compressed), x (unknown), o (OS specific), E (exclude),
  D (mbind), p (processor specific)
```

I'm assuming the bug is on LLVM's side in this case, because the start address of `.bss` matches when using GNU objcopy, whereas its four bytes short when using LLVM.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzFWEtz4jgQ_jVw6cJlCwzmwCGZTGapzWMrMI89Tcm2DJ7xayU5hP312y3bYAfiJbOHVYHBbenTp-5Wu1t-Hu4XS9jyZwE8A5FEEMWJAL3lGpawy8skhCT-iZIcdCkziDP8x0HyHfhxxuV-wD7g0BCWAzZLQct9nG2oN0-SPOCasAQMprblK4U_oESg4zyDMJb4L9kjoulSoVlwm0tQeSpACq7yjODxsRQQK5xXpYgLG16AL_ROiAzSvUHX4kUTPFE5zkajd9s42NLogoehCGEX6201g7_XQuFzRCkV0f708Bly_0eQF2ZZfqmRrkjxEfHcZLmk8cf-SfKcjuoB1sC-GdhX1XWdQ5wkpdISNTAY11IkJGMVPE8nozL7meW7bIQabwBg9FjpAEYjJfSoVtQoSvhGgVnQ-MZoFbklOQ_xJ8gzLTKtcAjqZIS2S4C5LogXnhaJsMigzX8EJ420WBYyD8tAqI49QWQhrQ17N6Trj7m1rHqhNjU2sXF1ICLbBoH3YDv0j81smLDZBJgzdcBjng2Me1MAq2rFtR4whyMUu-rAuQaOCc8Fm-GACFt1sQ1699LAHdpZxtV1Z3wIhQdI8pbaK3C9FgyYt0Y_5IEueQLPPCkF5JHxzboPdY-lFIl45pkmD1nCDzQyeoMIK2wCjdCDQ5HmmTE_-XpRyiJXQg3Y3AKaRPxVxjgDmg6CPE3JaY1b4vC2Tx3X0JX_J1d5n2-0Zf-rK5x1gGO70A0ouhhNvBj7kVNg3FJNkMKYE6JeyIp5qQvc_2RMvG0pjRAPO_rcTDWIsY2xS0fndYAw7sjx67iHkLilgVIRMaW51ORyGIfzKEIjg_3C7PD11Kt66G_10OYpwMC9fpAD9wYeOIa6Tlvvi67kKgylUKoleTRzNlimreK_X-F8zHRXeGv8D-7i7CfAMotyhE4wbrY4gU2cTtvD57u7jsB-1Y6SDqu3ux0lR8z2tU3KIVLmHdLh8MfT46fr5Xp1Qsozn2Y2p5cUcyfnSF19O0OKtUkxQ8rv2IU09dih9IoUc72aFM7bpynvHKmvh86tq9cmNTakQuGXm--xsXC_prp26Sc1tsXF5nPapCYtUtz3pXh-Fyl3yt4m5XizXyPltklJnm2Eeg-padTn6NPLHd2ZtllNW6ySOGs276WsZm6fp8_Zr6lq1iKFL82m_6Wk5qLPfpyfDHQA7lf_Rsp7pama2aWkfC_osd_8dPtdRGpuSFHOQLnDoV1KKmB9McE5Nd8lpBwT0i2T2lpcaxlj4ozO_rRcffjy_Wq9flpef15_fJvUeNpDajz_JZ9ynJb5Inl4B16sqVnf9gsv337t6OlUIV3tU839Vv_Vn_frq-s2wHlS4aRv981OSDneEdIZm-vslFQV0tG7X5FaP11EKvL7NOW9I1C1SVUhXW1f0bqQFMN3Sd_ue_d75nexp6LWJDitJOsrVQ07GWORx-aUt12RoM68jeAbCcSLCMpDn3sSpUJuGsGKBLhQzPdULVqSiN6v1X0z3x2JE0qvcon5Xt35sZoDqw14XAFm7pi3m_pUUp2BNWvd7xP128i8LGrB2hQ9d6vuJB9IiiGmoJzwMPiFpHXZWotyEuGMqhBBHMXNkj9WdIKkDEUX-casHIuNBrQgQU2Y6v4W0Ns5fHXSwJUqU3PWQIcHpSnOMBG-u_tybzJ6FYeiOlvABwFXwlT0IuBYrJkxJsUGXqe-WOm1DilSroNt79mAqSc51oNYUUV5KevDBLXNEbQ1jPhYw3AxDufjOR_qWCdi0anl0rgyVlNkNgcbTfEwLGWy2GpdGMdjt_jZYK1Y-vQawBsCq39GqMofOAxvEbSkgvPWddlkOtwu3Hnkjbk3t-duwJnwA3fuBFHInPFkYs-iYJhwXyRqgZsPt94wXjCbMdu1xw4hOJYdjr1p6Af-xHXmDPfnxBYpjxOLJrZyuRnKal1oC4UPk1hpdXyI5sJCQIgGn5caVbX4Pca6qEyGhu7CcP0Hm-C2Vg">