forked from OSchip/llvm-project
				
			ELF: Create a string table.
For now only the sections are in it, but it already makes the output easier to read and test. llvm-svn: 244702
This commit is contained in:
		
							parent
							
								
									4f89fdad9f
								
							
						
					
					
						commit
						6b83b90b6a
					
				| 
						 | 
				
			
			@ -15,6 +15,7 @@ add_llvm_library(lldELF2
 | 
			
		|||
  LINK_COMPONENTS
 | 
			
		||||
  Object
 | 
			
		||||
  Option
 | 
			
		||||
  MC
 | 
			
		||||
  Support
 | 
			
		||||
  )
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -12,7 +12,9 @@
 | 
			
		|||
#include "Error.h"
 | 
			
		||||
#include "SymbolTable.h"
 | 
			
		||||
#include "Writer.h"
 | 
			
		||||
 | 
			
		||||
#include "llvm/ADT/DenseMap.h"
 | 
			
		||||
#include "llvm/MC/StringTableBuilder.h"
 | 
			
		||||
#include "llvm/Support/FileOutputBuffer.h"
 | 
			
		||||
 | 
			
		||||
using namespace llvm;
 | 
			
		||||
| 
						 | 
				
			
			@ -41,6 +43,8 @@ public:
 | 
			
		|||
  void addSectionChunk(SectionChunk<ELFT> *C);
 | 
			
		||||
  std::vector<Chunk *> &getChunks() { return Chunks; }
 | 
			
		||||
  void writeHeaderTo(Elf_Shdr *SHdr);
 | 
			
		||||
  StringRef getName() { return Name; }
 | 
			
		||||
  void setNameOffset(uintX_t Offset) { Header.sh_name = Offset; }
 | 
			
		||||
 | 
			
		||||
  // Returns the size of the section in the output file.
 | 
			
		||||
  uintX_t getSize() { return Header.sh_size; }
 | 
			
		||||
| 
						 | 
				
			
			@ -73,6 +77,10 @@ private:
 | 
			
		|||
  uintX_t FileSize;
 | 
			
		||||
  uintX_t SizeOfHeaders;
 | 
			
		||||
  uintX_t SectionHeaderOff;
 | 
			
		||||
  uintX_t StringTableOff;
 | 
			
		||||
  unsigned StringTableIndex;
 | 
			
		||||
  StringTableBuilder StrTabBuilder;
 | 
			
		||||
  unsigned NumSections;
 | 
			
		||||
 | 
			
		||||
  std::vector<std::unique_ptr<Chunk>> Chunks;
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			@ -160,10 +168,26 @@ template <class ELFT> void Writer<ELFT>::assignAddresses() {
 | 
			
		|||
    Sec->setFileOffset(FileOff);
 | 
			
		||||
    VA += RoundUpToAlignment(Sec->getSize(), PageSize);
 | 
			
		||||
    FileOff += RoundUpToAlignment(Sec->getSize(), 8);
 | 
			
		||||
    StrTabBuilder.add(Sec->getName());
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Regular sections.
 | 
			
		||||
  NumSections = OutputSections.size();
 | 
			
		||||
 | 
			
		||||
  // First dummy section.
 | 
			
		||||
  NumSections++;
 | 
			
		||||
 | 
			
		||||
  // String table.
 | 
			
		||||
  StrTabBuilder.add(".strtab");
 | 
			
		||||
  StringTableIndex = NumSections;
 | 
			
		||||
  StringTableOff = FileOff;
 | 
			
		||||
  StrTabBuilder.finalize(StringTableBuilder::ELF);
 | 
			
		||||
  FileOff += StrTabBuilder.data().size();
 | 
			
		||||
  NumSections++;
 | 
			
		||||
 | 
			
		||||
  // Add space for section headers.
 | 
			
		||||
  SectionHeaderOff = FileOff;
 | 
			
		||||
  FileOff += (OutputSections.size() + 1) * sizeof(Elf_Shdr_Impl<ELFT>);
 | 
			
		||||
  FileOff += NumSections * sizeof(Elf_Shdr_Impl<ELFT>);
 | 
			
		||||
  FileSize = SizeOfHeaders + RoundUpToAlignment(FileOff - SizeOfHeaders, 8);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -192,8 +216,8 @@ template <class ELFT> void Writer<ELFT>::writeHeader() {
 | 
			
		|||
  EHdr->e_phentsize = sizeof(Elf_Phdr_Impl<ELFT>);
 | 
			
		||||
  EHdr->e_phnum = 1;
 | 
			
		||||
  EHdr->e_shentsize = sizeof(Elf_Shdr_Impl<ELFT>);
 | 
			
		||||
  EHdr->e_shnum = OutputSections.size() + 1;
 | 
			
		||||
  EHdr->e_shstrndx = 0;
 | 
			
		||||
  EHdr->e_shnum = NumSections;
 | 
			
		||||
  EHdr->e_shstrndx = StringTableIndex;
 | 
			
		||||
 | 
			
		||||
  auto PHdrs = reinterpret_cast<Elf_Phdr_Impl<ELFT> *>(Buf + EHdr->e_phoff);
 | 
			
		||||
  PHdrs->p_type = PT_LOAD;
 | 
			
		||||
| 
						 | 
				
			
			@ -208,10 +232,24 @@ template <class ELFT> void Writer<ELFT>::writeHeader() {
 | 
			
		|||
  auto SHdrs = reinterpret_cast<Elf_Shdr_Impl<ELFT> *>(Buf + EHdr->e_shoff);
 | 
			
		||||
  // First entry is null.
 | 
			
		||||
  ++SHdrs;
 | 
			
		||||
  for (OutputSection<ELFT> *Sec : OutputSections)
 | 
			
		||||
  for (OutputSection<ELFT> *Sec : OutputSections) {
 | 
			
		||||
    Sec->setNameOffset(StrTabBuilder.getOffset(Sec->getName()));
 | 
			
		||||
    Sec->writeHeaderTo(SHdrs++);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // String table.
 | 
			
		||||
  SHdrs->sh_name = StrTabBuilder.getOffset(".strtab");
 | 
			
		||||
  SHdrs->sh_type = SHT_STRTAB;
 | 
			
		||||
  SHdrs->sh_flags = 0;
 | 
			
		||||
  SHdrs->sh_addr = 0;
 | 
			
		||||
  SHdrs->sh_offset = StringTableOff;
 | 
			
		||||
  SHdrs->sh_size = StrTabBuilder.data().size();
 | 
			
		||||
  SHdrs->sh_link = 0;
 | 
			
		||||
  SHdrs->sh_info = 0;
 | 
			
		||||
  SHdrs->sh_addralign = 1;
 | 
			
		||||
  SHdrs->sh_entsize = 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <class ELFT> void Writer<ELFT>::openFile(StringRef Path) {
 | 
			
		||||
  std::error_code EC = FileOutputBuffer::create(Path, FileSize, Buffer,
 | 
			
		||||
                                                FileOutputBuffer::F_executable);
 | 
			
		||||
| 
						 | 
				
			
			@ -225,4 +263,8 @@ template <class ELFT> void Writer<ELFT>::writeSections() {
 | 
			
		|||
    for (Chunk *C : Sec->getChunks())
 | 
			
		||||
      C->writeTo(Buf);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // String table.
 | 
			
		||||
  StringRef Data = StrTabBuilder.data();
 | 
			
		||||
  memcpy(Buf + StringTableOff, Data.data(), Data.size());
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -25,15 +25,15 @@ _start:
 | 
			
		|||
# CHECK-NEXT:   Version: 1
 | 
			
		||||
# CHECK-NEXT:   Entry: 0x401000
 | 
			
		||||
# CHECK-NEXT:   ProgramHeaderOffset: 0x40
 | 
			
		||||
# CHECK-NEXT:   SectionHeaderOffset: 0x1010
 | 
			
		||||
# CHECK-NEXT:   SectionHeaderOffset: 0x102A
 | 
			
		||||
# CHECK-NEXT:   Flags [ (0x0)
 | 
			
		||||
# CHECK-NEXT:   ]
 | 
			
		||||
# CHECK-NEXT:   HeaderSize: 64
 | 
			
		||||
# CHECK-NEXT:   ProgramHeaderEntrySize: 56
 | 
			
		||||
# CHECK-NEXT:   ProgramHeaderCount: 1
 | 
			
		||||
# CHECK-NEXT:   SectionHeaderEntrySize: 64
 | 
			
		||||
# CHECK-NEXT:   SectionHeaderCount: 4
 | 
			
		||||
# CHECK-NEXT:    StringTableSectionIndex: 0
 | 
			
		||||
# CHECK-NEXT:   SectionHeaderCount: 5
 | 
			
		||||
# CHECK-NEXT:   StringTableSectionIndex: 4
 | 
			
		||||
# CHECK-NEXT: }
 | 
			
		||||
# CHECK-NEXT: Sections [
 | 
			
		||||
# CHECK-NEXT:   Section {
 | 
			
		||||
| 
						 | 
				
			
			@ -52,7 +52,7 @@ _start:
 | 
			
		|||
# CHECK-NEXT:   }
 | 
			
		||||
# CHECK-NEXT:   Section {
 | 
			
		||||
# CHECK-NEXT:     Index: 1
 | 
			
		||||
# CHECK-NEXT:     Name:  (0)
 | 
			
		||||
# CHECK-NEXT:     Name: .text
 | 
			
		||||
# CHECK-NEXT:     Type: SHT_PROGBITS (0x1)
 | 
			
		||||
# CHECK-NEXT:     Flags [ (0x6)
 | 
			
		||||
# CHECK-NEXT:       SHF_ALLOC (0x2)
 | 
			
		||||
| 
						 | 
				
			
			@ -68,7 +68,7 @@ _start:
 | 
			
		|||
# CHECK-NEXT:   }
 | 
			
		||||
# CHECK-NEXT:   Section {
 | 
			
		||||
# CHECK-NEXT:     Index: 2
 | 
			
		||||
# CHECK-NEXT:     Name:  (0)
 | 
			
		||||
# CHECK-NEXT:     Name: .data
 | 
			
		||||
# CHECK-NEXT:     Type: SHT_PROGBITS (0x1)
 | 
			
		||||
# CHECK-NEXT:     Flags [ (0x3)
 | 
			
		||||
# CHECK-NEXT:       SHF_ALLOC (0x2)
 | 
			
		||||
| 
						 | 
				
			
			@ -84,7 +84,7 @@ _start:
 | 
			
		|||
# CHECK-NEXT:   }
 | 
			
		||||
# CHECK-NEXT:   Section {
 | 
			
		||||
# CHECK-NEXT:     Index: 3
 | 
			
		||||
# CHECK-NEXT:     Name:  (0)
 | 
			
		||||
# CHECK-NEXT:     Name: .bss
 | 
			
		||||
# CHECK-NEXT:     Type: SHT_NOBITS (0x8)
 | 
			
		||||
# CHECK-NEXT:     Flags [ (0x3)
 | 
			
		||||
# CHECK-NEXT:       SHF_ALLOC (0x2)
 | 
			
		||||
| 
						 | 
				
			
			@ -98,6 +98,20 @@ _start:
 | 
			
		|||
# CHECK-NEXT:     AddressAlignment: 0
 | 
			
		||||
# CHECK-NEXT:     EntrySize: 0
 | 
			
		||||
# CHECK-NEXT:   }
 | 
			
		||||
# CHECK-NEXT:   Section {
 | 
			
		||||
# CHECK-NEXT:     Index: 4
 | 
			
		||||
# CHECK-NEXT:     Name: .strtab (12)
 | 
			
		||||
# CHECK-NEXT:     Type: SHT_STRTAB (0x3)
 | 
			
		||||
# CHECK-NEXT:     Flags [ (0x0)
 | 
			
		||||
# CHECK-NEXT:     ]
 | 
			
		||||
# CHECK-NEXT:     Address: 0x0
 | 
			
		||||
# CHECK-NEXT:     Offset: 0x1010
 | 
			
		||||
# CHECK-NEXT:     Size: 26
 | 
			
		||||
# CHECK-NEXT:     Link: 0
 | 
			
		||||
# CHECK-NEXT:     Info: 0
 | 
			
		||||
# CHECK-NEXT:     AddressAlignment: 1
 | 
			
		||||
# CHECK-NEXT:     EntrySize: 0
 | 
			
		||||
# CHECK-NEXT:   }
 | 
			
		||||
# CHECK-NEXT: ]
 | 
			
		||||
# CHECK-NEXT: ProgramHeaders [
 | 
			
		||||
# CHECK-NEXT:   ProgramHeader {
 | 
			
		||||
| 
						 | 
				
			
			@ -105,8 +119,8 @@ _start:
 | 
			
		|||
# CHECK-NEXT:     Offset: 0x0
 | 
			
		||||
# CHECK-NEXT:     VirtualAddress: 0x400000
 | 
			
		||||
# CHECK-NEXT:     PhysicalAddress: 0x400000
 | 
			
		||||
# CHECK-NEXT:     FileSize: 4368
 | 
			
		||||
# CHECK-NEXT:     MemSize: 4368
 | 
			
		||||
# CHECK-NEXT:     FileSize: 4464
 | 
			
		||||
# CHECK-NEXT:     MemSize: 4464
 | 
			
		||||
# CHECK-NEXT:     Flags [ (0x5)
 | 
			
		||||
# CHECK-NEXT:       PF_R (0x4)
 | 
			
		||||
# CHECK-NEXT:       PF_X (0x1)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -25,15 +25,15 @@ _start:
 | 
			
		|||
# CHECK-NEXT:   Version: 1
 | 
			
		||||
# CHECK-NEXT:   Entry: 0x401000
 | 
			
		||||
# CHECK-NEXT:   ProgramHeaderOffset: 0x34
 | 
			
		||||
# CHECK-NEXT:   SectionHeaderOffset: 0x1010
 | 
			
		||||
# CHECK-NEXT:   SectionHeaderOffset: 0x102A
 | 
			
		||||
# CHECK-NEXT:   Flags [ (0x0)
 | 
			
		||||
# CHECK-NEXT:   ]
 | 
			
		||||
# CHECK-NEXT:   HeaderSize: 52
 | 
			
		||||
# CHECK-NEXT:   ProgramHeaderEntrySize: 32
 | 
			
		||||
# CHECK-NEXT:   ProgramHeaderCount: 1
 | 
			
		||||
# CHECK-NEXT:   SectionHeaderEntrySize: 40
 | 
			
		||||
# CHECK-NEXT:   SectionHeaderCount: 4
 | 
			
		||||
# CHECK-NEXT:    StringTableSectionIndex: 0
 | 
			
		||||
# CHECK-NEXT:   SectionHeaderCount: 5
 | 
			
		||||
# CHECK-NEXT:   StringTableSectionIndex: 4
 | 
			
		||||
# CHECK-NEXT: }
 | 
			
		||||
# CHECK-NEXT: Sections [
 | 
			
		||||
# CHECK-NEXT:   Section {
 | 
			
		||||
| 
						 | 
				
			
			@ -52,7 +52,7 @@ _start:
 | 
			
		|||
# CHECK-NEXT:   }
 | 
			
		||||
# CHECK-NEXT:   Section {
 | 
			
		||||
# CHECK-NEXT:     Index: 1
 | 
			
		||||
# CHECK-NEXT:     Name:  (0)
 | 
			
		||||
# CHECK-NEXT:     Name: .text
 | 
			
		||||
# CHECK-NEXT:     Type: SHT_PROGBITS (0x1)
 | 
			
		||||
# CHECK-NEXT:     Flags [ (0x6)
 | 
			
		||||
# CHECK-NEXT:       SHF_ALLOC (0x2)
 | 
			
		||||
| 
						 | 
				
			
			@ -68,7 +68,7 @@ _start:
 | 
			
		|||
# CHECK-NEXT:   }
 | 
			
		||||
# CHECK-NEXT:   Section {
 | 
			
		||||
# CHECK-NEXT:     Index: 2
 | 
			
		||||
# CHECK-NEXT:     Name:  (0)
 | 
			
		||||
# CHECK-NEXT:     Name: .data
 | 
			
		||||
# CHECK-NEXT:     Type: SHT_PROGBITS (0x1)
 | 
			
		||||
# CHECK-NEXT:     Flags [ (0x3)
 | 
			
		||||
# CHECK-NEXT:       SHF_ALLOC (0x2)
 | 
			
		||||
| 
						 | 
				
			
			@ -84,7 +84,7 @@ _start:
 | 
			
		|||
# CHECK-NEXT:   }
 | 
			
		||||
# CHECK-NEXT:   Section {
 | 
			
		||||
# CHECK-NEXT:     Index: 3
 | 
			
		||||
# CHECK-NEXT:     Name:  (0)
 | 
			
		||||
# CHECK-NEXT:     Name: .bss
 | 
			
		||||
# CHECK-NEXT:     Type: SHT_NOBITS (0x8)
 | 
			
		||||
# CHECK-NEXT:     Flags [ (0x3)
 | 
			
		||||
# CHECK-NEXT:       SHF_ALLOC (0x2)
 | 
			
		||||
| 
						 | 
				
			
			@ -98,6 +98,20 @@ _start:
 | 
			
		|||
# CHECK-NEXT:     AddressAlignment: 0
 | 
			
		||||
# CHECK-NEXT:     EntrySize: 0
 | 
			
		||||
# CHECK-NEXT:   }
 | 
			
		||||
# CHECK-NEXT:   Section {
 | 
			
		||||
# CHECK-NEXT:     Index: 4
 | 
			
		||||
# CHECK-NEXT:     Name: .strtab
 | 
			
		||||
# CHECK-NEXT:     Type: SHT_STRTAB (0x3)
 | 
			
		||||
# CHECK-NEXT:     Flags [ (0x0)
 | 
			
		||||
# CHECK-NEXT:     ]
 | 
			
		||||
# CHECK-NEXT:     Address: 0x0
 | 
			
		||||
# CHECK-NEXT:     Offset: 0x1010
 | 
			
		||||
# CHECK-NEXT:     Size: 26
 | 
			
		||||
# CHECK-NEXT:     Link: 0
 | 
			
		||||
# CHECK-NEXT:     Info: 0
 | 
			
		||||
# CHECK-NEXT:     AddressAlignment: 1
 | 
			
		||||
# CHECK-NEXT:     EntrySize: 0
 | 
			
		||||
# CHECK-NEXT:   }
 | 
			
		||||
# CHECK-NEXT: ]
 | 
			
		||||
# CHECK-NEXT: ProgramHeaders [
 | 
			
		||||
# CHECK-NEXT:   ProgramHeader {
 | 
			
		||||
| 
						 | 
				
			
			@ -105,8 +119,8 @@ _start:
 | 
			
		|||
# CHECK-NEXT:     Offset: 0x0
 | 
			
		||||
# CHECK-NEXT:     VirtualAddress: 0x400000
 | 
			
		||||
# CHECK-NEXT:     PhysicalAddress: 0x400000
 | 
			
		||||
# CHECK-NEXT:     FileSize: 4272
 | 
			
		||||
# CHECK-NEXT:     MemSize: 4272
 | 
			
		||||
# CHECK-NEXT:     FileSize: 4344
 | 
			
		||||
# CHECK-NEXT:     MemSize: 4344
 | 
			
		||||
# CHECK-NEXT:     Flags [ (0x5)
 | 
			
		||||
# CHECK-NEXT:       PF_R (0x4)
 | 
			
		||||
# CHECK-NEXT:       PF_X (0x1)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -25,15 +25,15 @@ _start:
 | 
			
		|||
# CHECK-NEXT:   Version: 1
 | 
			
		||||
# CHECK-NEXT:   Entry: 0x401000
 | 
			
		||||
# CHECK-NEXT:   ProgramHeaderOffset: 0x34
 | 
			
		||||
# CHECK-NEXT:   SectionHeaderOffset: 0x1010
 | 
			
		||||
# CHECK-NEXT:   SectionHeaderOffset: 0x102A
 | 
			
		||||
# CHECK-NEXT:   Flags [ (0x0)
 | 
			
		||||
# CHECK-NEXT:   ]
 | 
			
		||||
# CHECK-NEXT:   HeaderSize: 52
 | 
			
		||||
# CHECK-NEXT:   ProgramHeaderEntrySize: 32
 | 
			
		||||
# CHECK-NEXT:   ProgramHeaderCount: 1
 | 
			
		||||
# CHECK-NEXT:   SectionHeaderEntrySize: 40
 | 
			
		||||
# CHECK-NEXT:   SectionHeaderCount: 4
 | 
			
		||||
# CHECK-NEXT:    StringTableSectionIndex: 0
 | 
			
		||||
# CHECK-NEXT:   SectionHeaderCount: 5
 | 
			
		||||
# CHECK-NEXT:    StringTableSectionIndex: 4
 | 
			
		||||
# CHECK-NEXT: }
 | 
			
		||||
# CHECK-NEXT: Sections [
 | 
			
		||||
# CHECK-NEXT:   Section {
 | 
			
		||||
| 
						 | 
				
			
			@ -52,7 +52,7 @@ _start:
 | 
			
		|||
# CHECK-NEXT:   }
 | 
			
		||||
# CHECK-NEXT:   Section {
 | 
			
		||||
# CHECK-NEXT:     Index: 1
 | 
			
		||||
# CHECK-NEXT:     Name:  (0)
 | 
			
		||||
# CHECK-NEXT:     Name: .text
 | 
			
		||||
# CHECK-NEXT:     Type: SHT_PROGBITS (0x1)
 | 
			
		||||
# CHECK-NEXT:     Flags [ (0x6)
 | 
			
		||||
# CHECK-NEXT:       SHF_ALLOC (0x2)
 | 
			
		||||
| 
						 | 
				
			
			@ -68,7 +68,7 @@ _start:
 | 
			
		|||
# CHECK-NEXT:   }
 | 
			
		||||
# CHECK-NEXT:   Section {
 | 
			
		||||
# CHECK-NEXT:     Index: 2
 | 
			
		||||
# CHECK-NEXT:     Name:  (0)
 | 
			
		||||
# CHECK-NEXT:     Name: .data
 | 
			
		||||
# CHECK-NEXT:     Type: SHT_PROGBITS (0x1)
 | 
			
		||||
# CHECK-NEXT:     Flags [ (0x3)
 | 
			
		||||
# CHECK-NEXT:       SHF_ALLOC (0x2)
 | 
			
		||||
| 
						 | 
				
			
			@ -84,7 +84,7 @@ _start:
 | 
			
		|||
# CHECK-NEXT:   }
 | 
			
		||||
# CHECK-NEXT:   Section {
 | 
			
		||||
# CHECK-NEXT:     Index: 3
 | 
			
		||||
# CHECK-NEXT:     Name:  (0)
 | 
			
		||||
# CHECK-NEXT:     Name: .bss
 | 
			
		||||
# CHECK-NEXT:     Type: SHT_NOBITS (0x8)
 | 
			
		||||
# CHECK-NEXT:     Flags [ (0x3)
 | 
			
		||||
# CHECK-NEXT:       SHF_ALLOC (0x2)
 | 
			
		||||
| 
						 | 
				
			
			@ -98,6 +98,20 @@ _start:
 | 
			
		|||
# CHECK-NEXT:     AddressAlignment: 0
 | 
			
		||||
# CHECK-NEXT:     EntrySize: 0
 | 
			
		||||
# CHECK-NEXT:   }
 | 
			
		||||
# CHECK-NEXT:   Section {
 | 
			
		||||
# CHECK-NEXT:     Index: 4
 | 
			
		||||
# CHECK-NEXT:     Name: .strtab
 | 
			
		||||
# CHECK-NEXT:     Type: SHT_STRTAB (0x3)
 | 
			
		||||
# CHECK-NEXT:     Flags [ (0x0)
 | 
			
		||||
# CHECK-NEXT:     ]
 | 
			
		||||
# CHECK-NEXT:     Address: 0x0
 | 
			
		||||
# CHECK-NEXT:     Offset: 0x1010
 | 
			
		||||
# CHECK-NEXT:     Size: 26
 | 
			
		||||
# CHECK-NEXT:     Link: 0
 | 
			
		||||
# CHECK-NEXT:     Info: 0
 | 
			
		||||
# CHECK-NEXT:     AddressAlignment: 1
 | 
			
		||||
# CHECK-NEXT:     EntrySize: 0
 | 
			
		||||
# CHECK-NEXT:   }
 | 
			
		||||
# CHECK-NEXT: ]
 | 
			
		||||
# CHECK-NEXT: ProgramHeaders [
 | 
			
		||||
# CHECK-NEXT:   ProgramHeader {
 | 
			
		||||
| 
						 | 
				
			
			@ -105,8 +119,8 @@ _start:
 | 
			
		|||
# CHECK-NEXT:     Offset: 0x0
 | 
			
		||||
# CHECK-NEXT:     VirtualAddress: 0x400000
 | 
			
		||||
# CHECK-NEXT:     PhysicalAddress: 0x400000
 | 
			
		||||
# CHECK-NEXT:     FileSize: 4272
 | 
			
		||||
# CHECK-NEXT:     MemSize: 4272
 | 
			
		||||
# CHECK-NEXT:     FileSize: 4344
 | 
			
		||||
# CHECK-NEXT:     MemSize: 4344
 | 
			
		||||
# CHECK-NEXT:     Flags [ (0x5)
 | 
			
		||||
# CHECK-NEXT:       PF_R (0x4)
 | 
			
		||||
# CHECK-NEXT:       PF_X (0x1)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -30,15 +30,15 @@ _start:
 | 
			
		|||
# CHECK-NEXT:   Version: 1
 | 
			
		||||
# CHECK-NEXT:   Entry: 0x401000
 | 
			
		||||
# CHECK-NEXT:   ProgramHeaderOffset: 0x40
 | 
			
		||||
# CHECK-NEXT:   SectionHeaderOffset: 0x1028
 | 
			
		||||
# CHECK-NEXT:   SectionHeaderOffset: 0x1047
 | 
			
		||||
# CHECK-NEXT:   Flags [ (0x0)
 | 
			
		||||
# CHECK-NEXT:   ]
 | 
			
		||||
# CHECK-NEXT:   HeaderSize: 64
 | 
			
		||||
# CHECK-NEXT:   ProgramHeaderEntrySize: 56
 | 
			
		||||
# CHECK-NEXT:   ProgramHeaderCount: 1
 | 
			
		||||
# CHECK-NEXT:   SectionHeaderEntrySize: 64
 | 
			
		||||
# CHECK-NEXT:   SectionHeaderCount: 5
 | 
			
		||||
# CHECK-NEXT:    StringTableSectionIndex: 0
 | 
			
		||||
# CHECK-NEXT:   SectionHeaderCount: 6
 | 
			
		||||
# CHECK-NEXT:    StringTableSectionIndex: 5
 | 
			
		||||
# CHECK-NEXT: }
 | 
			
		||||
# CHECK-NEXT: Sections [
 | 
			
		||||
# CHECK-NEXT:   Section {
 | 
			
		||||
| 
						 | 
				
			
			@ -57,7 +57,7 @@ _start:
 | 
			
		|||
# CHECK-NEXT:   }
 | 
			
		||||
# CHECK-NEXT:   Section {
 | 
			
		||||
# CHECK-NEXT:     Index: 1
 | 
			
		||||
# CHECK-NEXT:     Name:  (0)
 | 
			
		||||
# CHECK-NEXT:     Name: .text
 | 
			
		||||
# CHECK-NEXT:     Type: SHT_PROGBITS (0x1)
 | 
			
		||||
# CHECK-NEXT:     Flags [ (0x6)
 | 
			
		||||
# CHECK-NEXT:       SHF_ALLOC (0x2)
 | 
			
		||||
| 
						 | 
				
			
			@ -73,7 +73,7 @@ _start:
 | 
			
		|||
# CHECK-NEXT:   }
 | 
			
		||||
# CHECK-NEXT:   Section {
 | 
			
		||||
# CHECK-NEXT:     Index: 2
 | 
			
		||||
# CHECK-NEXT:     Name:  (0)
 | 
			
		||||
# CHECK-NEXT:     Name: .data
 | 
			
		||||
# CHECK-NEXT:     Type: SHT_PROGBITS (0x1)
 | 
			
		||||
# CHECK-NEXT:     Flags [ (0x3)
 | 
			
		||||
# CHECK-NEXT:       SHF_ALLOC (0x2)
 | 
			
		||||
| 
						 | 
				
			
			@ -89,7 +89,7 @@ _start:
 | 
			
		|||
# CHECK-NEXT:   }
 | 
			
		||||
# CHECK-NEXT:   Section {
 | 
			
		||||
# CHECK-NEXT:     Index: 3
 | 
			
		||||
# CHECK-NEXT:     Name:  (0)
 | 
			
		||||
# CHECK-NEXT:     Name: .bss
 | 
			
		||||
# CHECK-NEXT:     Type: SHT_NOBITS (0x8)
 | 
			
		||||
# CHECK-NEXT:     Flags [ (0x3)
 | 
			
		||||
# CHECK-NEXT:       SHF_ALLOC (0x2)
 | 
			
		||||
| 
						 | 
				
			
			@ -105,7 +105,7 @@ _start:
 | 
			
		|||
# CHECK-NEXT:   }
 | 
			
		||||
# CHECK-NEXT:   Section {
 | 
			
		||||
# CHECK-NEXT:     Index: 4
 | 
			
		||||
# CHECK-NEXT:     Name:  (0)
 | 
			
		||||
# CHECK-NEXT:     Name: .opd
 | 
			
		||||
# CHECK-NEXT:     Type: SHT_PROGBITS (0x1)
 | 
			
		||||
# CHECK-NEXT:     Flags [ (0x3)
 | 
			
		||||
# CHECK-NEXT:       SHF_ALLOC (0x2)
 | 
			
		||||
| 
						 | 
				
			
			@ -119,6 +119,20 @@ _start:
 | 
			
		|||
# CHECK-NEXT:     AddressAlignment: 0
 | 
			
		||||
# CHECK-NEXT:     EntrySize: 0
 | 
			
		||||
# CHECK-NEXT:   }
 | 
			
		||||
# CHECK-NEXT:   Section {
 | 
			
		||||
# CHECK-NEXT:     Index: 5
 | 
			
		||||
# CHECK-NEXT:     Name: .strtab
 | 
			
		||||
# CHECK-NEXT:     Type: SHT_STRTAB (0x3)
 | 
			
		||||
# CHECK-NEXT:     Flags [ (0x0)
 | 
			
		||||
# CHECK-NEXT:     ]
 | 
			
		||||
# CHECK-NEXT:     Address: 0x0
 | 
			
		||||
# CHECK-NEXT:     Offset: 0x1028
 | 
			
		||||
# CHECK-NEXT:     Size: 31
 | 
			
		||||
# CHECK-NEXT:     Link: 0
 | 
			
		||||
# CHECK-NEXT:     Info: 0
 | 
			
		||||
# CHECK-NEXT:     AddressAlignment: 1
 | 
			
		||||
# CHECK-NEXT:     EntrySize: 0
 | 
			
		||||
# CHECK-NEXT:   }
 | 
			
		||||
# CHECK-NEXT: ]
 | 
			
		||||
# CHECK-NEXT: ProgramHeaders [
 | 
			
		||||
# CHECK-NEXT:   ProgramHeader {
 | 
			
		||||
| 
						 | 
				
			
			@ -126,8 +140,8 @@ _start:
 | 
			
		|||
# CHECK-NEXT:     Offset: 0x0
 | 
			
		||||
# CHECK-NEXT:     VirtualAddress: 0x400000
 | 
			
		||||
# CHECK-NEXT:     PhysicalAddress: 0x400000
 | 
			
		||||
# CHECK-NEXT:     FileSize: 4456
 | 
			
		||||
# CHECK-NEXT:     MemSize: 4456
 | 
			
		||||
# CHECK-NEXT:     FileSize: 4552
 | 
			
		||||
# CHECK-NEXT:     MemSize: 4552
 | 
			
		||||
# CHECK-NEXT:     Flags [ (0x5)
 | 
			
		||||
# CHECK-NEXT:       PF_R (0x4)
 | 
			
		||||
# CHECK-NEXT:       PF_X (0x1)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,32 @@
 | 
			
		|||
// RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t
 | 
			
		||||
// RUN: lld -flavor gnu2 %t -o %t2
 | 
			
		||||
// RUN: llvm-readobj -sections -section-data %t2 | FileCheck %s
 | 
			
		||||
// REQUIRES: x86
 | 
			
		||||
 | 
			
		||||
.global _start
 | 
			
		||||
_start:
 | 
			
		||||
 | 
			
		||||
.section bar, "a"
 | 
			
		||||
.section foobar, "a"
 | 
			
		||||
 | 
			
		||||
// Test that the sting "bar" is merged into "foobar"
 | 
			
		||||
 | 
			
		||||
// CHECK:      Section {
 | 
			
		||||
// CHECK:        Index: 6
 | 
			
		||||
// CHECK-NEXT:   Name: .strtab
 | 
			
		||||
// CHECK-NEXT:   Type: SHT_STRTAB (0x3)
 | 
			
		||||
// CHECK-NEXT:   Flags [ (0x0)
 | 
			
		||||
// CHECK-NEXT:   ]
 | 
			
		||||
// CHECK-NEXT:   Address: 0x0
 | 
			
		||||
// CHECK-NEXT:   Offset:
 | 
			
		||||
// CHECK-NEXT:   Size: 33
 | 
			
		||||
// CHECK-NEXT:   Link: 0
 | 
			
		||||
// CHECK-NEXT:   Info: 0
 | 
			
		||||
// CHECK-NEXT:   AddressAlignment: 1
 | 
			
		||||
// CHECK-NEXT:   EntrySize: 0
 | 
			
		||||
// CHECK-NEXT:   SectionData (
 | 
			
		||||
// CHECK-NEXT:     0000: 002E7465 7874002E 62737300 666F6F62  |..text..bss.foob|
 | 
			
		||||
// CHECK-NEXT:     0010: 6172002E 73747274 6162002E 64617461  |ar..strtab..data|
 | 
			
		||||
// CHECK-NEXT:     0020: 00                                   |.|
 | 
			
		||||
// CHECK-NEXT:   )
 | 
			
		||||
// CHECK-NEXT: }
 | 
			
		||||
		Loading…
	
		Reference in New Issue