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

    <tr>
        <th>Summary</th>
        <td>
            Stripping BOLTed binaries may result in misaligned PT_LOADs
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

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

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

<pre>
    Consider the following simple `main.cc` file:
```c++
int main() {}
```

Running:
```shell
$ clang++ main.cc -o main -Wl,-q
$ llvm-bolt main -o main.bolted
$ llvm-strip -S main.bolted -o main.bolted.stripped
```

Results in a misaligned `PT_LOAD`:
```
  Type           Offset   VirtAddr           PhysAddr           FileSiz  MemSiz   Flg Align
...
  LOAD           0x003028 0x0000000000200000 0x0000000000200000 0x200384 0x200384 R E 0x200000
```

which leads to program crashes at startup:
```
$ ./main.bolted.stripped
[1]    153575 segmentation fault  ./main.bolted.stripped
$ /lib64/ld-linux-x86-64.so.2 ./main.bolted.stripped
./main.bolted.stripped: error while loading shared libraries: ./main.bolted.stripped: ELF load command address/offset not properly aligned
```

This is because the new `PT_PHDR` header was placed at the same offset as the new `PT_LOAD` containing the modified `.text` section:

```
$ llvm-readelf -l -h main.bolted
...
  Type           Offset   VirtAddr           PhysAddr           FileSiz  MemSiz   Flg Align
  PHDR           0x200000 0x0000000000200000 0x0000000000200000 0x000310 0x000310 R   0x8
...
  LOAD           0x200000 0x0000000000200000 0x0000000000200000 0x200384 0x200384 R E 0x200000
```

Which confuses `llvm-strip`, as it thinks that the `PT_LOAD` is a [child](https://github.com/llvm/llvm-project/blob/0538e5431afdb1fa05bdcedf70ee502ccfcd112a/llvm/lib/ObjCopy/ELF/ELFObject.cpp#L1350-L1364) of the `PT_PHDR` and thus it will [disregard](https://github.com/llvm/llvm-project/blob/0538e5431afdb1fa05bdcedf70ee502ccfcd112a/llvm/lib/ObjCopy/ELF/ELFObject.cpp#L2245-L2248) the alignment requirements of the (alleged) child.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzNVktv4zYQ_jXyZSBBop4-6OAkG_SQIkESdI8LSqQsbilRS1J13F_fIa2snZeDLVCghkCNyHlwON83dKPYvr5UoxGMa7A9h05JqXZi3IIRwyQ5BEU8UDFGbYsSdELyIN0E8VUQb3Di8LQBuXCPnxWjBWcRkCogawjKi6C8emWwfPrxfh5HjPfWq-m5lMscyaCVFLV8IFh2BKHyIoRfZUAuwx9HbSn_GsJGSbsoHBQjN8PZKzVjtZggfDhVeWUReZ3pp-m7iXAzS2sAw1EYhKFSbEf0hGp3j99ubjdXzuBNmodPgMf9xOH4u-06wy0KfwhtN4zpk7W7fm9eTV1jYR7E3wC_88G_4VpuYeO2cAgQRdFzJLeVE9P4KY7TmFReeP4RP74_hUJaZUfhHr4cPvB35nx2vWh7kJwyA1bBpNVW0wFaTbHSBqgFY6m28_TRGbmCRQG5PlOX_CIJcp9ckqd5mYPh24GPllqhRugoFgg-84FRUEGKpsjcm4VSjPNT-FQVYZFFRkXkEw8frqYb4ForDXgUSC2pKPNM66lGnGBETbXgxumd8_Hl5trbQquGgY4MKGKBG4Mm6oCaUVl3vhPXcg8LDs9U5rEXCFsDDW_pbLhvBCPfLci9--3q3nG_x8phl9hRA5OkLe4YS-ZUDR04LJFx8aX1gnvcK1ZBOKZ7hUEx0YkDOyLLn6zTMbx1dTrW_yMUeNpqtx_ZQSgh7N_S-wTw_zG10AqP6AWjztHn_ak0ORHuvZPqc-b-Ypx_ydyvnrlYwQ7RYVzJjn3TqZJLV3fh0CDGPx0CFmS8hAAijAJStEX0M6Qp3hC9tZPDO0IXn62w_dxECGtHPAyxvELE8nfEBn42UjX4ivO04nmWJrRjTdLROG8YIrIrY87zmLRt17IkIfTEj3B2t833SzXtUUISHUacQtdRO00BSW-SNI9DHB331wjqkzSeeeAYh_v0Ce-ElC4lJozmW6r_r2kRkuWhG_2d7HLyXcG1RtD8xyw0d7L5mTGpqJR8i2RCfV-waMXrpMirqiBVWa1YnbJ1uqYrK6zk9YPvT47dF7c3j8jrRoy-mSEx9xjCXY3uZjy5FxdkmNWsZf3LJyaMmblreXlRptWqr-OClJRkCaUdJ2y9rrokWce0XDdVygqaryRtuDQ1VisgxDUo7wJlrNlK1CQmJC5JkayTLC2jrOySrONFy7qCsqQKsphjj5GR20ek9Hal68OfjHlrcFEKY81xkRrjsuQ-HPqns-2VrumAvb5d-ci13_k_78PEsg">