This is an archive of the discontinued LLVM Phabricator instance.

[ELF] Don't advance sh_offset for an empty section whose PT_LOAD is removed (due to p_memsz=0)
ClosedPublic

Authored by MaskRay on May 1 2020, 11:35 AM.

Details

Summary

removeEmptyPTLoad() removes empty (p_memsz=0) PT_LOAD segments. In
assignFileOffsets(), setFileOffset() unnecessarily advances file offsets
for containing empty sections.

This is exposed by arm Linux kernel's multi_v5_defconfig
(see https://bugs.llvm.org/show_bug.cgi?id=45632)

ld.lld (max-page-size=65536):
  [34] .init.data        PROGBITS        c0c24000 c34000 0128ac 00  WA  0   0 4096
  [35] .text_itcm        PROGBITS        fffe0000 c50000 000000 00  WA  0   0  1
  [36] .data_dtcm        PROGBITS        fffe8000 c58000 000000 00  WA  0   0  1
  [37] .data             PROGBITS        c0c38000 c58000 0647a0 00  WA  0   0 32

arm-linux-gnueabi-ld (max-page-size=65536):
  [23] .init.data        PROGBITS        c0c12000 c22000 0128ac 00  WA  0   0 4096
  [24] .text_itcm        PROGBITS        fffe0000 ca2558 000000 00   W  0   0  1
  [25] .data_dtcm        PROGBITS        fffe8000 ca2558 000000 00   W  0   0  1
  [26] .data             PROGBITS        c0c26000 c36000 0647a0 00  WA  0   0 32

This patch clears OutputSection::ptLoad if ptLoad is removed by
removeEmptyPTLoad(). Conceptually this removes "dangling" references.

Diff Detail

Event Timeline

MaskRay created this revision.May 1 2020, 11:35 AM
psmith accepted this revision.May 2 2020, 1:58 AM

Thanks for following this up. This looks good to me, will be worth waiting till Monday to see if there are comments throughout the working day.

This revision is now accepted and ready to land.May 2 2020, 1:58 AM
This revision was automatically updated to reflect the committed changes.