From c37f8af5777fecfd848ca4755c854d736d755d40 Mon Sep 17 00:00:00 2001 From: Shankar Easwaran Date: Fri, 14 Nov 2014 04:57:21 +0000 Subject: [PATCH] [ELF] Dynamic section was not aligned properly. The dynamic section was not aligned properly. The alignment of the section is determined by the word size of the architecture. llvm-svn: 221972 --- lld/lib/ReaderWriter/ELF/SectionChunks.h | 18 ++++++++++++---- lld/test/elf/Hexagon/dynlib-hash.test | 6 +++--- lld/test/elf/Hexagon/dynlib-syms.test | 2 +- lld/test/elf/Mips/exe-dynamic.test | 36 ++++++++++++++++---------------- lld/test/elf/Mips/exe-fileheader.test | 2 +- lld/test/elf/Mips/gp-sym-1.test | 4 ++-- lld/test/elf/Mips/hilo16-1.test | 2 +- lld/test/elf/Mips/hilo16-2.test | 32 ++++++++++++++-------------- lld/test/elf/Mips/hilo16-3.test | 10 ++++----- lld/test/elf/Mips/hilo16-4.test | 16 +++++++------- lld/test/elf/Mips/la25-stub.test | 28 ++++++++++++------------- lld/test/elf/Mips/plt-header.test | 18 ++++++++-------- lld/test/elf/Mips/r26-1.test | 26 +++++++++++------------ lld/test/elf/Mips/r26-2.test | 28 ++++++++++++------------- lld/test/elf/Mips/rel-dynamic-03.test | 26 +++++++++++------------ lld/test/elf/Mips/rel-dynamic-05.test | 14 ++++++------- lld/test/elf/Mips/rel-dynamic-07.test | 2 +- lld/test/elf/Mips/rel-dynamic-11.test | 2 +- lld/test/elf/Mips/tls-1.test | 2 +- lld/test/elf/ifunc.test | 2 +- lld/test/elf/phdr.test | 2 +- 21 files changed, 144 insertions(+), 134 deletions(-) diff --git a/lld/lib/ReaderWriter/ELF/SectionChunks.h b/lld/lib/ReaderWriter/ELF/SectionChunks.h index 833cea6..7332ac6 100644 --- a/lld/lib/ReaderWriter/ELF/SectionChunks.h +++ b/lld/lib/ReaderWriter/ELF/SectionChunks.h @@ -41,7 +41,8 @@ public: Section(const ELFLinkingContext &context, StringRef name, typename Chunk::Kind k = Chunk::Kind::ELFSection) : Chunk(name, k, context), _parent(nullptr), _flags(0), _entSize(0), - _type(0), _link(0), _info(0), _segmentType(SHT_NULL) {} + _type(0), _link(0), _info(0), _isFirstSectionInMerge(false), + _segmentType(SHT_NULL) {} /// \brief Modify the section contents before assigning virtual addresses // or assigning file offsets @@ -94,13 +95,20 @@ public: virtual bool findAtomAddrByName(StringRef, uint64_t &) { return false; } - void setMergedSection(MergedSections *ms) { _parent = ms; } + void setMergedSection(MergedSections *ms, bool isFirst = false) { + _parent = ms; + _isFirstSectionInMerge = isFirst; + } static bool classof(const Chunk *c) { return c->kind() == Chunk::Kind::ELFSection || c->kind() == Chunk::Kind::AtomSection; } + uint64_t align2() const override { + return _isFirstSectionInMerge ? _parent->align2() : this->_align2; + } + protected: /// \brief MergedSections this Section is a member of, or nullptr. MergedSections *_parent; @@ -114,6 +122,8 @@ protected: uint32_t _link; /// \brief the sh_info field. uint32_t _info; + /// \brief Is this the first section in the merged section list. + bool _isFirstSectionInMerge; /// \brief the output ELF segment type of this section. Layout::SegmentType _segmentType; }; @@ -503,7 +513,7 @@ MergedSections::appendSection(Chunk *c) { _type = section->getType(); if (_flags < section->getFlags()) _flags = section->getFlags(); - section->setMergedSection(this); + section->setMergedSection(this, (_sections.size() == 0)); } _kind = c->kind(); _sections.push_back(c); @@ -1022,7 +1032,7 @@ public: : Section(context, str), _layout(layout) { this->setOrder(order); this->_entSize = sizeof(Elf_Dyn); - this->_align2 = llvm::alignOf(); + this->_align2 = ELFT::Is64Bits ? 8 : 4; // Reserve space for the DT_NULL entry. this->_fsize = sizeof(Elf_Dyn); this->_msize = sizeof(Elf_Dyn); diff --git a/lld/test/elf/Hexagon/dynlib-hash.test b/lld/test/elf/Hexagon/dynlib-hash.test index 9fe8621..f931764 100644 --- a/lld/test/elf/Hexagon/dynlib-hash.test +++ b/lld/test/elf/Hexagon/dynlib-hash.test @@ -4,6 +4,6 @@ RUN: llvm-objdump -s %t > %t1 RUN: FileCheck -check-prefix=CHECKHASH %s < %t1 CHECKHASH: Contents of section .hash: -CHECKHASH: 00a0 03000000 07000000 06000000 01000000 ................ -CHECKHASH: 00b0 04000000 00000000 00000000 00000000 ................ -CHECKHASH: 00c0 00000000 03000000 02000000 05000000 ................ +CHECKHASH: 0094 03000000 07000000 06000000 01000000 +CHECKHASH: 00a4 04000000 00000000 00000000 00000000 +CHECKHASH: 00b4 00000000 03000000 02000000 05000000 diff --git a/lld/test/elf/Hexagon/dynlib-syms.test b/lld/test/elf/Hexagon/dynlib-syms.test index 35af24c..e649230 100644 --- a/lld/test/elf/Hexagon/dynlib-syms.test +++ b/lld/test/elf/Hexagon/dynlib-syms.test @@ -3,5 +3,5 @@ RUN: -o %t --noinhibit-exec -shared RUN: llvm-nm -n -M %t > %t1 RUN: FileCheck -check-prefix=CHECKSYMS %s < %t1 -CHECKSYMS: 0000026c A _DYNAMIC +CHECKSYMS: 0000025c A _DYNAMIC CHECKSYMS: 00001008 A _GLOBAL_OFFSET_TABLE_ diff --git a/lld/test/elf/Mips/exe-dynamic.test b/lld/test/elf/Mips/exe-dynamic.test index c9f0b6c..cfbfdaf 100644 --- a/lld/test/elf/Mips/exe-dynamic.test +++ b/lld/test/elf/Mips/exe-dynamic.test @@ -15,24 +15,24 @@ # CHECK: LoadName: # CHECK: DynamicSection [ (18 entries) # CHECK: Tag Type Name/Value -# CHECK-NEXT: 0x00000004 HASH 0x400110 -# CHECK-NEXT: 0x00000005 STRTAB 0x400144 -# CHECK-NEXT: 0x00000006 SYMTAB 0x400124 -# CHECK-NEXT: 0x0000000A STRSZ 28 (bytes) -# CHECK-NEXT: 0x0000000B SYMENT 16 (bytes) -# CHECK-NEXT: 0x00000002 PLTRELSZ 8 (bytes) -# CHECK-NEXT: 0x70000032 MIPS_PLTGOT 0x402000 -# CHECK-NEXT: 0x00000014 PLTREL REL -# CHECK-NEXT: 0x00000017 JMPREL 0x400160 -# CHECK-NEXT: 0x70000001 MIPS_RLD_VERSION 1 -# CHECK-NEXT: 0x70000005 MIPS_FLAGS NOTPOT -# CHECK-NEXT: 0x70000006 MIPS_BASE_ADDRESS 0x400000 -# CHECK-NEXT: 0x7000000A MIPS_LOCAL_GOTNO 2 -# CHECK-NEXT: 0x70000011 MIPS_SYMTABNO 2 -# CHECK-NEXT: 0x70000013 MIPS_GOTSYM 0x2 -# CHECK-NEXT: 0x00000003 PLTGOT 0x401000 -# CHECK-NEXT: 0x00000001 NEEDED SharedLibrary (exe-dynamic.test.{{.*}}) -# CHECK-NEXT: 0x00000000 NULL 0x0 +# CHECK-NEXT: 0x00000004 HASH 0x400104 +# CHECK-NEXT: 0x00000005 STRTAB 0x400138 +# CHECK-NEXT: 0x00000006 SYMTAB 0x400118 +# CHECK-NEXT: 0x0000000A STRSZ 28 (bytes) +# CHECK-NEXT: 0x0000000B SYMENT 16 (bytes) +# CHECK-NEXT: 0x00000002 PLTRELSZ 8 (bytes) +# CHECK-NEXT: 0x70000032 MIPS_PLTGOT 0x402000 +# CHECK-NEXT: 0x00000014 PLTREL REL +# CHECK-NEXT: 0x00000017 JMPREL 0x400154 +# CHECK-NEXT: 0x70000001 MIPS_RLD_VERSION 1 +# CHECK-NEXT: 0x70000005 MIPS_FLAGS NOTPOT +# CHECK-NEXT: 0x70000006 MIPS_BASE_ADDRESS 0x400000 +# CHECK-NEXT: 0x7000000A MIPS_LOCAL_GOTNO 2 +# CHECK-NEXT: 0x70000011 MIPS_SYMTABNO 2 +# CHECK-NEXT: 0x70000013 MIPS_GOTSYM 0x2 +# CHECK-NEXT: 0x00000003 PLTGOT 0x401000 +# CHECK-NEXT: 0x00000001 NEEDED SharedLibrary (exe-dynamic.test.tmp.so) +# CHECK-NEXT: 0x00000000 NULL 0x0 # CHECK-NEXT: ] # so.o diff --git a/lld/test/elf/Mips/exe-fileheader.test b/lld/test/elf/Mips/exe-fileheader.test index 3a3d223..ff0d381 100644 --- a/lld/test/elf/Mips/exe-fileheader.test +++ b/lld/test/elf/Mips/exe-fileheader.test @@ -26,7 +26,7 @@ # CHECK: Type: Executable (0x2) # CHECK: Machine: EM_MIPS (0x8) # CHECK: Version: 1 -# CHECK: Entry: 0x4001A0 +# CHECK: Entry: 0x400190 # CHECK: ProgramHeaderOffset: 0x34 # CHECK: SectionHeaderOffset: 0x2280 # CHECK: Flags [ (0x70001005) diff --git a/lld/test/elf/Mips/gp-sym-1.test b/lld/test/elf/Mips/gp-sym-1.test index ad36cc0..cbd726d 100644 --- a/lld/test/elf/Mips/gp-sym-1.test +++ b/lld/test/elf/Mips/gp-sym-1.test @@ -11,9 +11,9 @@ # SYM-NEXT: Value: 0x408FF0 # SEC: Contents of section .text: -# SEC-NEXT: 4001a0 41000000 f08f0000 64001000 A.......d... +# SEC-NEXT: 400190 41000000 f08f0000 60001000 # SEC: Contents of section .got: -# SEC-NEXT: 401000 00000000 00000080 ........ +# SEC-NEXT: 401000 00000000 00000080 # so.o --- diff --git a/lld/test/elf/Mips/hilo16-1.test b/lld/test/elf/Mips/hilo16-1.test index dcd515f..c2863408 100644 --- a/lld/test/elf/Mips/hilo16-1.test +++ b/lld/test/elf/Mips/hilo16-1.test @@ -16,7 +16,7 @@ # CHECK-NEXT: {{[0-9a-f]+}}: 3e 00 08 3c lui $8, 62 # CHECK-NEXT: {{[0-9a-f]+}}: 40 02 08 3c lui $8, 576 # CHECK-NEXT: {{[0-9a-f]+}}: 40 fe 08 3c lui $8, 65088 -# CHECK-NEXT: {{[0-9a-f]+}}: 65 01 08 85 lh $8, 357($8) +# CHECK-NEXT: {{[0-9a-f]+}}: 55 01 08 85 lh $8, 341($8) # CHECK: SYMBOL TABLE: # CHECK: {{[0-9a-f]+}} g F .text 00000024 glob1 diff --git a/lld/test/elf/Mips/hilo16-2.test b/lld/test/elf/Mips/hilo16-2.test index dad8d83..68cb26e 100644 --- a/lld/test/elf/Mips/hilo16-2.test +++ b/lld/test/elf/Mips/hilo16-2.test @@ -12,22 +12,22 @@ # CHECK: Disassembly of section .text: # CHECK: glob1: -# CHECK-NEXT: {{[0-9a-f]+}}: 40 00 08 3c lui $8, 64 -# CHECK-NEXT: {{[0-9a-f]+}}: 81 01 08 85 lh $8, 385($8) -# CHECK-NEXT: {{[0-9a-f]+}}: 40 00 08 3c lui $8, 64 -# CHECK-NEXT: {{[0-9a-f]+}}: 7f 01 08 85 lh $8, 383($8) -# CHECK-NEXT: {{[0-9a-f]+}}: 40 00 08 3c lui $8, 64 -# CHECK-NEXT: {{[0-9a-f]+}}: 7f 03 08 85 lh $8, 895($8) -# CHECK-NEXT: {{[0-9a-f]+}}: 40 00 08 3c lui $8, 64 -# CHECK-NEXT: {{[0-9a-f]+}}: 81 ff 08 85 lh $8, -127($8) -# CHECK-NEXT: {{[0-9a-f]+}}: 42 00 08 3c lui $8, 66 -# CHECK-NEXT: {{[0-9a-f]+}}: 7f 01 08 85 lh $8, 383($8) -# CHECK-NEXT: {{[0-9a-f]+}}: 3e 00 08 3c lui $8, 62 -# CHECK-NEXT: {{[0-9a-f]+}}: 81 01 08 85 lh $8, 385($8) -# CHECK-NEXT: {{[0-9a-f]+}}: 40 02 08 3c lui $8, 576 -# CHECK-NEXT: {{[0-9a-f]+}}: 7f 01 08 85 lh $8, 383($8) -# CHECK-NEXT: {{[0-9a-f]+}}: 40 fe 08 3c lui $8, 65088 -# CHECK-NEXT: {{[0-9a-f]+}}: 81 01 08 85 lh $8, 385($8) +# CHECK-NEXT: {{[0-9a-f]+}}: 40 00 08 3c lui $8, 64 +# CHECK-NEXT: {{[0-9a-f]+}}: 71 01 08 85 lh $8, 369($8) +# CHECK-NEXT: {{[0-9a-f]+}}: 40 00 08 3c lui $8, 64 +# CHECK-NEXT: {{[0-9a-f]+}}: 6f 01 08 85 lh $8, 367($8) +# CHECK-NEXT: {{[0-9a-f]+}}: 40 00 08 3c lui $8, 64 +# CHECK-NEXT: {{[0-9a-f]+}}: 6f 03 08 85 lh $8, 879($8) +# CHECK-NEXT: {{[0-9a-f]+}}: 40 00 08 3c lui $8, 64 +# CHECK-NEXT: {{[0-9a-f]+}}: 71 ff 08 85 lh $8, -143($8) +# CHECK-NEXT: {{[0-9a-f]+}}: 42 00 08 3c lui $8, 66 +# CHECK-NEXT: {{[0-9a-f]+}}: 6f 01 08 85 lh $8, 367($8) +# CHECK-NEXT: {{[0-9a-f]+}}: 3e 00 08 3c lui $8, 62 +# CHECK-NEXT: {{[0-9a-f]+}}: 71 01 08 85 lh $8, 369($8) +# CHECK-NEXT: {{[0-9a-f]+}}: 40 02 08 3c lui $8, 576 +# CHECK-NEXT: {{[0-9a-f]+}}: 6f 01 08 85 lh $8, 367($8) +# CHECK-NEXT: {{[0-9a-f]+}}: 40 fe 08 3c lui $8, 65088 +# CHECK-NEXT: {{[0-9a-f]+}}: 71 01 08 85 lh $8, 369($8) # CHECK: SYMBOL TABLE: # CHECK: {{[0-9a-f]+}} g F .text 00000040 glob1 diff --git a/lld/test/elf/Mips/hilo16-3.test b/lld/test/elf/Mips/hilo16-3.test index 21bec44..daf4807 100644 --- a/lld/test/elf/Mips/hilo16-3.test +++ b/lld/test/elf/Mips/hilo16-3.test @@ -13,15 +13,15 @@ # CHECK: Disassembly of section .text: # CHECK: glob1: # CHECK-NEXT: {{[0-9a-f]+}}: 01 00 08 3c lui $8, 1 -# CHECK-NEXT: {{[0-9a-f]+}}: f1 8e 08 85 lh $8, -28943($8) +# CHECK-NEXT: {{[0-9a-f]+}}: 01 8f 08 85 lh $8, -28927($8) # CHECK-NEXT: {{[0-9a-f]+}}: 01 00 08 3c lui $8, 1 -# CHECK-NEXT: {{[0-9a-f]+}}: e7 8e 08 85 lh $8, -28953($8) +# CHECK-NEXT: {{[0-9a-f]+}}: f7 8e 08 85 lh $8, -28937($8) # CHECK-NEXT: {{[0-9a-f]+}}: 01 00 08 3c lui $8, 1 -# CHECK-NEXT: {{[0-9a-f]+}}: df 90 08 85 lh $8, -28449($8) +# CHECK-NEXT: {{[0-9a-f]+}}: ef 90 08 85 lh $8, -28433($8) # CHECK-NEXT: {{[0-9a-f]+}}: 01 00 08 3c lui $8, 1 -# CHECK-NEXT: {{[0-9a-f]+}}: d9 8c 08 85 lh $8, -29479($8) +# CHECK-NEXT: {{[0-9a-f]+}}: e9 8c 08 85 lh $8, -29463($8) # CHECK-NEXT: {{[0-9a-f]+}}: 03 00 08 3c lui $8, 3 -# CHECK-NEXT: {{[0-9a-f]+}}: cf 8e 08 85 lh $8, -28977($8) +# CHECK-NEXT: {{[0-9a-f]+}}: df 8e 08 85 lh $8, -28961($8) # CHECK: SYMBOL TABLE: # CHECK: {{[0-9a-f]+}} g F .text 00000028 glob1 diff --git a/lld/test/elf/Mips/hilo16-4.test b/lld/test/elf/Mips/hilo16-4.test index 0d61c56..8a13f7b 100644 --- a/lld/test/elf/Mips/hilo16-4.test +++ b/lld/test/elf/Mips/hilo16-4.test @@ -7,20 +7,20 @@ # CHECK: Disassembly of section .text: # CHECK: glob1: -# CHECK-NEXT: 400140: 40 00 04 3c lui $4, 64 -# CHECK-NEXT: 400144: ff 9f a6 8c lw $6, -24577($5) +# CHECK-NEXT: 400130: 40 00 04 3c lui $4, 64 +# CHECK-NEXT: 400134: ff 9f a6 8c lw $6, -24577($5) # CHECK: glob2: -# CHECK-NEXT: 400148: 00 20 c7 80 lb $7, 8192($6) -# CHECK-NEXT: 40014c: 04 20 c8 80 lb $8, 8196($6) +# CHECK-NEXT: 400138: 00 20 c7 80 lb $7, 8192($6) +# CHECK-NEXT: 40013c: 04 20 c8 80 lb $8, 8196($6) # CHECK: glob3: -# CHECK-NEXT: 400150: 40 80 05 3c lui $5, 32832 +# CHECK-NEXT: 400140: 40 80 05 3c lui $5, 32832 # CHECK: SYMBOL TABLE: -# CHECK: 00400140 g F .text 00000008 glob1 -# CHECK: 00400148 g F .text 00000008 glob2 -# CHECK: 00400150 g F .text 00000004 glob3 +# CHECK: 00400130 g F .text 00000008 glob1 +# CHECK: 00400138 g F .text 00000008 glob2 +# CHECK: 00400140 g F .text 00000004 glob3 # CHECK: 00402000 g .data 0000000c X !ELF diff --git a/lld/test/elf/Mips/la25-stub.test b/lld/test/elf/Mips/la25-stub.test index f0cbcc7..2c4b264 100644 --- a/lld/test/elf/Mips/la25-stub.test +++ b/lld/test/elf/Mips/la25-stub.test @@ -11,25 +11,25 @@ # RUN: llvm-objdump -s %t.exe | FileCheck -check-prefix=ASM %s # SYM: Name: loc (13) -# SYM-NEXT: Value: 0x400144 +# SYM-NEXT: Value: 0x400134 # SYM: Name: T1N (1) -# SYM-NEXT: Value: 0x400120 +# SYM-NEXT: Value: 0x400110 # SYM: Name: T1 (5) -# SYM-NEXT: Value: 0x400130 +# SYM-NEXT: Value: 0x400120 # SYM: Name: glob (8) -# SYM-NEXT: Value: 0x400134 +# SYM-NEXT: Value: 0x400124 # ASM: Contents of section .text: -# ASM-NEXT: 400120 00000000 00000000 00000000 00000000 ................ -# ASM-NEXT: 400130 00000000 00000000 00000000 4d001000 ............M... -# 0x10004d << 2 == 0x400134 (glob) --^ -# ASM-NEXT: 400140 00000000 4d001000 00000000 48001000 ....M.......H... -# ^-- 0x10004d << 2 == 0x400134 (glob) -# 0x100048 << 2 == 0x400120 (T1N) --^ -# ASM-NEXT: 400150 00000000 58001000 00000000 00000000 ....X........... -# ^-- 0x100058 << 2 == 0x400160 (T1 stub) -# ASM-NEXT: 400160 4000193c 4c001008 30013927 00000000 @..