diff --git a/llvm/lib/ObjectYAML/ELFEmitter.cpp b/llvm/lib/ObjectYAML/ELFEmitter.cpp --- a/llvm/lib/ObjectYAML/ELFEmitter.cpp +++ b/llvm/lib/ObjectYAML/ELFEmitter.cpp @@ -903,7 +903,8 @@ assignSectionAddress(SHeader, YAMLSec); - SHeader.sh_offset = alignToOffset(CBA, SHeader.sh_addralign, /*Offset=*/None); + SHeader.sh_offset = + alignToOffset(CBA, SHeader.sh_addralign, RawSec ? RawSec->Offset : None); if (RawSec && (RawSec->Content || RawSec->Size)) { assert(Symbols.empty()); diff --git a/llvm/test/tools/yaml2obj/ELF/dynsym-section.yaml b/llvm/test/tools/yaml2obj/ELF/dynsym-section.yaml new file mode 100644 --- /dev/null +++ b/llvm/test/tools/yaml2obj/ELF/dynsym-section.yaml @@ -0,0 +1,33 @@ +## Check how we produce SHT_DYNSYM sections. + +## Check we do not crash/assert when .dynsym is specified +## explicitly, but .dynstr is not present. +## Check we set the sh_link field to 0 for the .dynsym section in this case. + +# RUN: yaml2obj %s -o %t1 +# RUN: llvm-readelf --section-headers %t1 | FileCheck %s + +# CHECK: Section Headers: +# CHECK-NEXT: [Nr] Name Type Address Off Size ES Flg Lk +# CHECK-NEXT: [ 0] NULL 0000000000000000 000000 000000 00 0 0 +# CHECK-NEXT: [ 1] .dynsym DYNSYM 0000000000000000 000040 000018 18 A 0 + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_DYN +Sections: + - Name: .dynsym + Type: SHT_DYNSYM + Offset: [[OFFSET=]] + +## Check we can use the "Offset" key to to set an arbitrary offset for the SHT_DYNSYM section. + +# RUN: yaml2obj %s -DOFFSET=0x100 -o %t2 +# RUN: llvm-readelf --section-headers %t2 | FileCheck %s --check-prefix=OFFSET + +# OFFSET: Section Headers: +# OFFSET-NEXT: [Nr] Name Type Address Off Size ES Flg Lk Inf Al +# OFFSET-NEXT: [ 0] NULL 0000000000000000 000000 000000 00 0 0 0 +# OFFSET-NEXT: [ 1] .dynsym DYNSYM 0000000000000000 000100 000018 18 A 0 1 0 diff --git a/llvm/test/tools/yaml2obj/ELF/explicit-dynsym-no-dynstr.yaml b/llvm/test/tools/yaml2obj/ELF/explicit-dynsym-no-dynstr.yaml deleted file mode 100644 --- a/llvm/test/tools/yaml2obj/ELF/explicit-dynsym-no-dynstr.yaml +++ /dev/null @@ -1,21 +0,0 @@ -## Check we do not crash/assert when .dynsym is specified -## explicitly, but .dynstr is not present. - -# RUN: yaml2obj %s -o %t -# RUN: llvm-readelf --section-headers %t | FileCheck %s - -## Check that .dynsym has Link field set to 0. - -# CHECK: Section Headers: -# CHECK-NEXT: [Nr] Name Type Address Off Size ES Flg Lk -# CHECK-NEXT: [ 0] NULL 0000000000000000 000000 000000 00 0 0 -# CHECK-NEXT: [ 1] .dynsym DYNSYM 0000000000000000 000040 000018 18 A 0 - ---- !ELF -FileHeader: - Class: ELFCLASS64 - Data: ELFDATA2LSB - Type: ET_DYN -Sections: - - Name: .dynsym - Type: SHT_DYNSYM