From 5e39ac8c25d32593474bb7309f2c8038b4ba625a Mon Sep 17 00:00:00 2001 From: Jonathon Penix Date: Tue, 18 Feb 2025 15:15:47 -0800 Subject: [PATCH 1/3] [llvm-objcopy] Let --change-section-lma change segments wth filesz=0, memsz>0 Currently, segments with a file size of 0 are ignored for the purposes of --change-section-lma, regardless of their memory size. It seems reasonable to me to modify such segments given that we're changing the LMA for all sections and these LMAs may be used during loading. GNU objcopy also seems to adjust such segments. Fixes #124680 --- llvm/lib/ObjCopy/ELF/ELFObjcopy.cpp | 2 +- .../llvm-objcopy/ELF/change-section-lma.test | 17 +++++++++++++---- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/llvm/lib/ObjCopy/ELF/ELFObjcopy.cpp b/llvm/lib/ObjCopy/ELF/ELFObjcopy.cpp index 9c78f7433ad33..20a8e67625cac 100644 --- a/llvm/lib/ObjCopy/ELF/ELFObjcopy.cpp +++ b/llvm/lib/ObjCopy/ELF/ELFObjcopy.cpp @@ -824,7 +824,7 @@ static Error handleArgs(const CommonConfig &Config, const ELFConfig &ELFConfig, if (Config.ChangeSectionLMAValAll != 0) { for (Segment &Seg : Obj.segments()) { - if (Seg.FileSize > 0) { + if (Seg.FileSize > 0 || Seg.MemSize > 0) { if (Config.ChangeSectionLMAValAll > 0 && Seg.PAddr > std::numeric_limits::max() - Config.ChangeSectionLMAValAll) { diff --git a/llvm/test/tools/llvm-objcopy/ELF/change-section-lma.test b/llvm/test/tools/llvm-objcopy/ELF/change-section-lma.test index c1cd1eb46d949..00a9e6de8d4a8 100644 --- a/llvm/test/tools/llvm-objcopy/ELF/change-section-lma.test +++ b/llvm/test/tools/llvm-objcopy/ELF/change-section-lma.test @@ -14,16 +14,18 @@ # CHECK-PLUS-PROGRAMS: Type Offset VirtAddr PhysAddr FileSiz MemSiz # CHECK-PLUS-PROGRAMS: PHDR 0x000002 0x0000000000001102 0x0000000000001122 0x000038 0x000000 -# CHECK-PLUS-PROGRAMS: LOAD 0x000000 0x0000000000001100 0x0000000000001120 0x000258 0x000258 -# CHECK-PLUS-PROGRAMS: LOAD 0x000258 0xffffffff00005100 0xffffffff00006120 0x000100 0x000100 +# CHECK-PLUS-PROGRAMS: LOAD 0x000000 0x0000000000001100 0x0000000000001120 0x000290 0x000290 +# CHECK-PLUS-PROGRAMS: LOAD 0x000290 0xffffffff00005100 0xffffffff00006120 0x000100 0x000100 # CHECK-PLUS-PROGRAMS: NOTE 0x000358 0x0000000000001200 0x0000000000001220 0x000010 0x000000 # CHECK-PLUS-PROGRAMS: NOTE 0x000368 0x0000000000000000 0x0000000000000000 0x000000 0x000000 +# CHECK-PLUS-PROGRAMS: LOAD 0x000390 0x0000000000001300 0x0000000000001320 0x000000 0x000010 # CHECK-MINUS-PROGRAMS: PHDR 0x000002 0x0000000000001102 0x00000000000010d2 0x000038 0x000000 -# CHECK-MINUS-PROGRAMS: LOAD 0x000000 0x0000000000001100 0x00000000000010d0 0x000258 0x000258 -# CHECK-MINUS-PROGRAMS: LOAD 0x000258 0xffffffff00005100 0xffffffff000060d0 0x000100 0x000100 +# CHECK-MINUS-PROGRAMS: LOAD 0x000000 0x0000000000001100 0x00000000000010d0 0x000290 0x000290 +# CHECK-MINUS-PROGRAMS: LOAD 0x000290 0xffffffff00005100 0xffffffff000060d0 0x000100 0x000100 # CHECK-MINUS-PROGRAMS: NOTE 0x000358 0x0000000000001200 0x00000000000011d0 0x000010 0x000000 # CHECK-MINUS-PROGRAMS: NOTE 0x000368 0x0000000000000000 0x0000000000000000 0x000000 0x000000 +# CHECK-MINUS-PROGRAMS: LOAD 0x000390 0x0000000000001300 0x00000000000012d0 0x000000 0x000010 # CHECK-PLUS-SECTIONS: [Nr] Name Type Address Off Size ES Flg Lk Inf Al # CHECK-PLUS-SECTIONS: .text1 @@ -55,6 +57,9 @@ Sections: - Name: .text2 Type: SHT_PROGBITS Size: 0x100 + - Name: .bss1 + Type: SHT_NOBITS + Size: 0x10 ProgramHeaders: - Type: PT_PHDR FileSize: 0x38 @@ -77,3 +82,7 @@ ProgramHeaders: - Type: PT_NOTE FileSize: 0x0 Offset: 0x368 + - Type: PT_LOAD + VAddr: 0x1300 + FirstSec: .bss1 + LastSec: .bss1 From 3d232518bc408e6d697a6b7ce115b9e578e793ce Mon Sep 17 00:00:00 2001 From: Jonathon Penix Date: Mon, 24 Feb 2025 15:42:47 -0800 Subject: [PATCH 2/3] fixup! [llvm-objcopy] Let --change-section-lma change segments wth filesz=0, memsz>0 --- llvm/lib/ObjCopy/ELF/ELFObjcopy.cpp | 2 +- .../llvm-objcopy/ELF/change-section-lma.test | 30 ++++++++++++------- 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/llvm/lib/ObjCopy/ELF/ELFObjcopy.cpp b/llvm/lib/ObjCopy/ELF/ELFObjcopy.cpp index 20a8e67625cac..1a31bfa2e0db3 100644 --- a/llvm/lib/ObjCopy/ELF/ELFObjcopy.cpp +++ b/llvm/lib/ObjCopy/ELF/ELFObjcopy.cpp @@ -824,7 +824,7 @@ static Error handleArgs(const CommonConfig &Config, const ELFConfig &ELFConfig, if (Config.ChangeSectionLMAValAll != 0) { for (Segment &Seg : Obj.segments()) { - if (Seg.FileSize > 0 || Seg.MemSize > 0) { + if (Seg.MemSize > 0) { if (Config.ChangeSectionLMAValAll > 0 && Seg.PAddr > std::numeric_limits::max() - Config.ChangeSectionLMAValAll) { diff --git a/llvm/test/tools/llvm-objcopy/ELF/change-section-lma.test b/llvm/test/tools/llvm-objcopy/ELF/change-section-lma.test index 00a9e6de8d4a8..6d2bc28fbdb16 100644 --- a/llvm/test/tools/llvm-objcopy/ELF/change-section-lma.test +++ b/llvm/test/tools/llvm-objcopy/ELF/change-section-lma.test @@ -13,19 +13,21 @@ # RUN: not llvm-objcopy --change-section-lma *+0x100000000 %t 2>&1 | FileCheck %s --check-prefix=ERR-OVERFLOW # CHECK-PLUS-PROGRAMS: Type Offset VirtAddr PhysAddr FileSiz MemSiz -# CHECK-PLUS-PROGRAMS: PHDR 0x000002 0x0000000000001102 0x0000000000001122 0x000038 0x000000 -# CHECK-PLUS-PROGRAMS: LOAD 0x000000 0x0000000000001100 0x0000000000001120 0x000290 0x000290 -# CHECK-PLUS-PROGRAMS: LOAD 0x000290 0xffffffff00005100 0xffffffff00006120 0x000100 0x000100 -# CHECK-PLUS-PROGRAMS: NOTE 0x000358 0x0000000000001200 0x0000000000001220 0x000010 0x000000 +# CHECK-PLUS-PROGRAMS: PHDR 0x000002 0x0000000000001102 0x0000000000001122 0x000038 0x000038 +# CHECK-PLUS-PROGRAMS: LOAD 0x000000 0x0000000000001100 0x0000000000001120 0x0002c8 0x0002c8 +# CHECK-PLUS-PROGRAMS: LOAD 0x0002c8 0xffffffff00005100 0xffffffff00006120 0x000100 0x000100 +# CHECK-PLUS-PROGRAMS: NOTE 0x000358 0x0000000000001200 0x0000000000001220 0x000010 0x000010 # CHECK-PLUS-PROGRAMS: NOTE 0x000368 0x0000000000000000 0x0000000000000000 0x000000 0x000000 -# CHECK-PLUS-PROGRAMS: LOAD 0x000390 0x0000000000001300 0x0000000000001320 0x000000 0x000010 +# CHECK-PLUS-PROGRAMS: LOAD 0x0003c8 0x0000000000001300 0x0000000000001320 0x000000 0x000010 +# CHECK-PLUS-PROGRAMS: NOTE 0x000378 0x0000000000001400 0x0000000000001400 0x000010 0x000000 -# CHECK-MINUS-PROGRAMS: PHDR 0x000002 0x0000000000001102 0x00000000000010d2 0x000038 0x000000 -# CHECK-MINUS-PROGRAMS: LOAD 0x000000 0x0000000000001100 0x00000000000010d0 0x000290 0x000290 -# CHECK-MINUS-PROGRAMS: LOAD 0x000290 0xffffffff00005100 0xffffffff000060d0 0x000100 0x000100 -# CHECK-MINUS-PROGRAMS: NOTE 0x000358 0x0000000000001200 0x00000000000011d0 0x000010 0x000000 +# CHECK-MINUS-PROGRAMS: PHDR 0x000002 0x0000000000001102 0x00000000000010d2 0x000038 0x000038 +# CHECK-MINUS-PROGRAMS: LOAD 0x000000 0x0000000000001100 0x00000000000010d0 0x0002c8 0x0002c8 +# CHECK-MINUS-PROGRAMS: LOAD 0x0002c8 0xffffffff00005100 0xffffffff000060d0 0x000100 0x000100 +# CHECK-MINUS-PROGRAMS: NOTE 0x000358 0x0000000000001200 0x00000000000011d0 0x000010 0x000010 # CHECK-MINUS-PROGRAMS: NOTE 0x000368 0x0000000000000000 0x0000000000000000 0x000000 0x000000 -# CHECK-MINUS-PROGRAMS: LOAD 0x000390 0x0000000000001300 0x00000000000012d0 0x000000 0x000010 +# CHECK-MINUS-PROGRAMS: LOAD 0x0003c8 0x0000000000001300 0x00000000000012d0 0x000000 0x000010 +# CHECK-MINUS-PROGRAMS: NOTE 0x000378 0x0000000000001400 0x0000000000001400 0x000010 0x000000 # CHECK-PLUS-SECTIONS: [Nr] Name Type Address Off Size ES Flg Lk Inf Al # CHECK-PLUS-SECTIONS: .text1 @@ -63,6 +65,7 @@ Sections: ProgramHeaders: - Type: PT_PHDR FileSize: 0x38 + MemSize: 0x38 Offset: 0x2 VAddr: 0x1102 - Type: PT_LOAD @@ -77,12 +80,19 @@ ProgramHeaders: LastSec: .text2 - Type: PT_NOTE FileSize: 0x10 + MemSize: 0x10 VAddr: 0x1200 Offset: 0x358 - Type: PT_NOTE FileSize: 0x0 + MemSize: 0x0 Offset: 0x368 - Type: PT_LOAD VAddr: 0x1300 FirstSec: .bss1 LastSec: .bss1 + - Type: PT_NOTE + FileSize: 0x10 + MemSize: 0x0 + VAddr: 0x1400 + Offset: 0x378 From 91ebc90de6aab8152f229466d573c1768a4b2840 Mon Sep 17 00:00:00 2001 From: Jonathon Penix Date: Wed, 26 Feb 2025 11:04:38 -0800 Subject: [PATCH 3/3] fixup! [llvm-objcopy] Let --change-section-lma change segments wth filesz=0, memsz>0 --- llvm/test/tools/llvm-objcopy/ELF/change-section-lma.test | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/llvm/test/tools/llvm-objcopy/ELF/change-section-lma.test b/llvm/test/tools/llvm-objcopy/ELF/change-section-lma.test index 6d2bc28fbdb16..ee4648dc7aa81 100644 --- a/llvm/test/tools/llvm-objcopy/ELF/change-section-lma.test +++ b/llvm/test/tools/llvm-objcopy/ELF/change-section-lma.test @@ -19,7 +19,7 @@ # CHECK-PLUS-PROGRAMS: NOTE 0x000358 0x0000000000001200 0x0000000000001220 0x000010 0x000010 # CHECK-PLUS-PROGRAMS: NOTE 0x000368 0x0000000000000000 0x0000000000000000 0x000000 0x000000 # CHECK-PLUS-PROGRAMS: LOAD 0x0003c8 0x0000000000001300 0x0000000000001320 0x000000 0x000010 -# CHECK-PLUS-PROGRAMS: NOTE 0x000378 0x0000000000001400 0x0000000000001400 0x000010 0x000000 +# CHECK-PLUS-PROGRAMS: NOTE 0x000378 0x0000000000000000 0x0000000000000000 0x000010 0x000000 # CHECK-MINUS-PROGRAMS: PHDR 0x000002 0x0000000000001102 0x00000000000010d2 0x000038 0x000038 # CHECK-MINUS-PROGRAMS: LOAD 0x000000 0x0000000000001100 0x00000000000010d0 0x0002c8 0x0002c8 @@ -27,7 +27,7 @@ # CHECK-MINUS-PROGRAMS: NOTE 0x000358 0x0000000000001200 0x00000000000011d0 0x000010 0x000010 # CHECK-MINUS-PROGRAMS: NOTE 0x000368 0x0000000000000000 0x0000000000000000 0x000000 0x000000 # CHECK-MINUS-PROGRAMS: LOAD 0x0003c8 0x0000000000001300 0x00000000000012d0 0x000000 0x000010 -# CHECK-MINUS-PROGRAMS: NOTE 0x000378 0x0000000000001400 0x0000000000001400 0x000010 0x000000 +# CHECK-MINUS-PROGRAMS: NOTE 0x000378 0x0000000000000000 0x0000000000000000 0x000010 0x000000 # CHECK-PLUS-SECTIONS: [Nr] Name Type Address Off Size ES Flg Lk Inf Al # CHECK-PLUS-SECTIONS: .text1 @@ -94,5 +94,4 @@ ProgramHeaders: - Type: PT_NOTE FileSize: 0x10 MemSize: 0x0 - VAddr: 0x1400 Offset: 0x378