gdb-object-file.go: discard program headers
This commit is contained in:
parent
03957f0069
commit
eaa1125b7c
|
@ -1,4 +1,4 @@
|
||||||
// Non-optimizing Brainfuck compiler generating binaries for Linux on x86-64
|
// Non-optimizing Brainfuck compiler generating object files for Linux on x86-64
|
||||||
// with debugging information mapping instructions onto an IR dump.
|
// with debugging information mapping instructions onto an IR dump.
|
||||||
// gofmt has been tried, with disappointing results.
|
// gofmt has been tried, with disappointing results.
|
||||||
// codegen{} is also pretty ugly in the way it works but damn convenient.
|
// codegen{} is also pretty ugly in the way it works but damn convenient.
|
||||||
|
@ -149,11 +149,6 @@ func (a *codegen) dw(v interface{}) *codegen { a.append(le(v)[:2]); return a }
|
||||||
func (a *codegen) dd(v interface{}) *codegen { a.append(le(v)[:4]); return a }
|
func (a *codegen) dd(v interface{}) *codegen { a.append(le(v)[:4]); return a }
|
||||||
func (a *codegen) dq(v interface{}) *codegen { a.append(le(v)[:8]); return a }
|
func (a *codegen) dq(v interface{}) *codegen { a.append(le(v)[:8]); return a }
|
||||||
|
|
||||||
const (
|
|
||||||
ElfCodeAddr = 0x400000 // Where the code is loaded in memory
|
|
||||||
ElfDataAddr = 0x800000 // Where the tape is placed in memory
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
const (
|
||||||
SYS_READ = 0
|
SYS_READ = 0
|
||||||
SYS_WRITE = 1
|
SYS_WRITE = 1
|
||||||
|
@ -332,36 +327,9 @@ func main() {
|
||||||
ElfDataSize = 1 << 20 // Tape length
|
ElfDataSize = 1 << 20 // Tape length
|
||||||
)
|
)
|
||||||
|
|
||||||
// - - Program headers - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
codeOffset := ElfHeaderSize
|
||||||
|
pieces := [][]byte{code}
|
||||||
ph := codegen{}
|
position := codeOffset + len(code)
|
||||||
phCount := 2
|
|
||||||
|
|
||||||
codeOffset := ElfHeaderSize + phCount*ElfProgramEntrySize
|
|
||||||
codeEndOffset := codeOffset + len(code)
|
|
||||||
|
|
||||||
// Program header for code
|
|
||||||
// The entry point address seems to require alignment, so map start of file
|
|
||||||
ph.dd(elf.PT_LOAD).dd(elf.PF_R | elf.PF_X)
|
|
||||||
ph.dq(0) // Offset within the file
|
|
||||||
ph.dq(ElfCodeAddr) // Address in virtual memory
|
|
||||||
ph.dq(ElfCodeAddr) // Address in physical memory
|
|
||||||
ph.dq(codeEndOffset) // Length within the file
|
|
||||||
ph.dq(codeEndOffset) // Length within memory
|
|
||||||
ph.dq(4096) // Segment alignment
|
|
||||||
|
|
||||||
// Program header for the tape
|
|
||||||
ph.dd(elf.PT_LOAD).dd(elf.PF_R | elf.PF_W)
|
|
||||||
ph.dq(0) // Offset within the file
|
|
||||||
ph.dq(ElfDataAddr) // Address in virtual memory
|
|
||||||
ph.dq(ElfDataAddr) // Address in physical memory
|
|
||||||
ph.dq(0) // Length within the file
|
|
||||||
ph.dq(ElfDataSize) // One megabyte of memory
|
|
||||||
ph.dq(4096) // Segment alignment
|
|
||||||
|
|
||||||
// Now that the rigid part has been generated, we can append sections
|
|
||||||
pieces := [][]byte{ph.buf, code}
|
|
||||||
position := codeEndOffset
|
|
||||||
|
|
||||||
// - - Sections - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - Sections - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
|
||||||
|
@ -387,7 +355,7 @@ func main() {
|
||||||
stringTable.code(".text\x00")
|
stringTable.code(".text\x00")
|
||||||
sh.dd(elf.SHT_PROGBITS)
|
sh.dd(elf.SHT_PROGBITS)
|
||||||
sh.dq(elf.SHF_ALLOC | elf.SHF_EXECINSTR)
|
sh.dq(elf.SHF_ALLOC | elf.SHF_EXECINSTR)
|
||||||
sh.dq(ElfCodeAddr + codeOffset) // Memory address
|
sh.dq(0) // Memory address
|
||||||
sh.dq(codeOffset) // Byte offset
|
sh.dq(codeOffset) // Byte offset
|
||||||
sh.dq(len(code)) // Byte size
|
sh.dq(len(code)) // Byte size
|
||||||
sh.dd(0).dd(0) // No link, no info
|
sh.dd(0).dd(0) // No link, no info
|
||||||
|
@ -401,7 +369,7 @@ func main() {
|
||||||
stringTable.code(".bss\x00")
|
stringTable.code(".bss\x00")
|
||||||
sh.dd(elf.SHT_NOBITS)
|
sh.dd(elf.SHT_NOBITS)
|
||||||
sh.dq(elf.SHF_ALLOC | elf.SHF_WRITE)
|
sh.dq(elf.SHF_ALLOC | elf.SHF_WRITE)
|
||||||
sh.dq(ElfDataAddr) // Memory address
|
sh.dq(0) // Memory address
|
||||||
sh.dq(0) // Byte offset
|
sh.dq(0) // Byte offset
|
||||||
sh.dq(ElfDataSize) // Byte size
|
sh.dq(ElfDataSize) // Byte size
|
||||||
sh.dd(0).dd(0) // No link, no info
|
sh.dd(0).dd(0) // No link, no info
|
||||||
|
@ -466,6 +434,10 @@ func main() {
|
||||||
|
|
||||||
// - - Text relocation records - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - Text relocation records - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
|
||||||
|
// ld.gold doesn't support SHT_REL, with SHT_RELA it overrides the target.
|
||||||
|
// ld.bfd addends to the target even with SHT_RELA.
|
||||||
|
// Thus, with SHT_RELA the target needs to be all zeros to be portable.
|
||||||
|
|
||||||
textRel := codegen{}
|
textRel := codegen{}
|
||||||
// Relocation record for code[tapeoff] += &tape
|
// Relocation record for code[tapeoff] += &tape
|
||||||
textRel.dq(tapeoff).dq(elf.R_INFO(1, uint32(elf.R_X86_64_32)))
|
textRel.dq(tapeoff).dq(elf.R_INFO(1, uint32(elf.R_X86_64_32)))
|
||||||
|
@ -682,13 +654,13 @@ func main() {
|
||||||
bin.code("\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00")
|
bin.code("\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00")
|
||||||
// The BFD linker will happily try to link ET_EXEC though
|
// The BFD linker will happily try to link ET_EXEC though
|
||||||
bin.dw(elf.ET_REL).dw(elf.EM_X86_64).dd(elf.EV_CURRENT)
|
bin.dw(elf.ET_REL).dw(elf.EM_X86_64).dd(elf.EV_CURRENT)
|
||||||
bin.dq(ElfCodeAddr + codeOffset) // Entry point address
|
bin.dq(0) // Entry point address
|
||||||
bin.dq(ElfHeaderSize) // Program header offset
|
bin.dq(0) // Program header offset
|
||||||
bin.dq(position) // Section header offset
|
bin.dq(position) // Section header offset
|
||||||
bin.dd(0) // No processor-specific flags
|
bin.dd(0) // No processor-specific flags
|
||||||
bin.dw(ElfHeaderSize) // ELF header size
|
bin.dw(ElfHeaderSize) // ELF header size
|
||||||
bin.dw(ElfProgramEntrySize) // Program header table entry size
|
bin.dw(ElfProgramEntrySize) // Program header table entry size
|
||||||
bin.dw(phCount) // Program header table entry count
|
bin.dw(0) // Program header table entry count
|
||||||
bin.dw(ElfSectionEntrySize) // Section header table entry size
|
bin.dw(ElfSectionEntrySize) // Section header table entry size
|
||||||
bin.dw(shCount) // Section header table entry count
|
bin.dw(shCount) // Section header table entry count
|
||||||
bin.dw(shCount - 1) // Section index for strings
|
bin.dw(shCount - 1) // Section index for strings
|
||||||
|
|
Loading…
Reference in New Issue