[llvm] 535520c - [llvm-objcopy] --gap-fill and 0-size sections (#75837)

via llvm-commits llvm-commits at lists.llvm.org
Tue Dec 19 13:30:33 PST 2023


Author: quic-akaryaki
Date: 2023-12-19T15:30:29-06:00
New Revision: 535520c6636f9a2bd7cd8fcb221e598a372cae9e

URL: https://github.com/llvm/llvm-project/commit/535520c6636f9a2bd7cd8fcb221e598a372cae9e
DIFF: https://github.com/llvm/llvm-project/commit/535520c6636f9a2bd7cd8fcb221e598a372cae9e.diff

LOG: [llvm-objcopy] --gap-fill and 0-size sections (#75837)

In the change that added `--gap-fill`, the condition to choose the
sections to write in `BinaryWriter::write()` did not exclude zero-size
sections. However, zero-size sections did not have correct offsets
assigned in `BinaryWriter::finalize()`. The result is either a failed
assertion, or memory corruption due to writing to the buffer beyond its
size.
To fix this, exclude zero-size sections from writing. Also, add a zero-size
section to the test, which would trigger the problem.

Added: 
    

Modified: 
    llvm/lib/ObjCopy/ELF/ELFObject.cpp
    llvm/test/tools/llvm-objcopy/ELF/gap-fill.test

Removed: 
    


################################################################################
diff  --git a/llvm/lib/ObjCopy/ELF/ELFObject.cpp b/llvm/lib/ObjCopy/ELF/ELFObject.cpp
index 5352736bdcb9b8..c8b66d6fcb5ebf 100644
--- a/llvm/lib/ObjCopy/ELF/ELFObject.cpp
+++ b/llvm/lib/ObjCopy/ELF/ELFObject.cpp
@@ -2638,7 +2638,7 @@ template <class ELFT> Error ELFWriter<ELFT>::finalize() {
 Error BinaryWriter::write() {
   SmallVector<const SectionBase *, 30> SectionsToWrite;
   for (const SectionBase &Sec : Obj.allocSections()) {
-    if (Sec.Type != SHT_NOBITS)
+    if (Sec.Type != SHT_NOBITS && Sec.Size > 0)
       SectionsToWrite.push_back(&Sec);
   }
 

diff  --git a/llvm/test/tools/llvm-objcopy/ELF/gap-fill.test b/llvm/test/tools/llvm-objcopy/ELF/gap-fill.test
index c11909746330bb..23dd6a302891b9 100644
--- a/llvm/test/tools/llvm-objcopy/ELF/gap-fill.test
+++ b/llvm/test/tools/llvm-objcopy/ELF/gap-fill.test
@@ -106,6 +106,11 @@ Sections:
     Flags:           [ SHF_ALLOC, SHF_EXECINSTR ]
     Address:         0x0108
     Content:         'AABBCCDDFEDCBA'
+  - Name:            .zero_size
+    Type:            SHT_PROGBITS
+    Flags:           [ SHF_ALLOC ]
+    Address:         0x0110
+    Size:            0
   - Name:            .space2
     Type:            Fill
     Pattern:         'DC'


        


More information about the llvm-commits mailing list