mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
x64 machine code generation (ELF)
This commit is contained in:
161
vlib/compiler/x64/elf_obj.v
Normal file
161
vlib/compiler/x64/elf_obj.v
Normal file
@@ -0,0 +1,161 @@
|
||||
// Copyright (c) 2019 Alexander Medvednikov. All rights reserved.
|
||||
// Use of this source code is governed by an MIT license
|
||||
// that can be found in the LICENSE file.
|
||||
|
||||
module x64
|
||||
|
||||
/*
|
||||
This file is unused right now, since binaries without sections
|
||||
are generated.
|
||||
|
||||
But it will be necessary once we have dynamic linking.
|
||||
*/
|
||||
|
||||
enum SectionType {
|
||||
null = 0
|
||||
progbits = 1
|
||||
symtab = 2
|
||||
strtab = 3
|
||||
rela = 4
|
||||
}
|
||||
|
||||
struct SectionConfig {
|
||||
name string
|
||||
typ SectionType
|
||||
flags i64
|
||||
data voidptr
|
||||
is_saa bool
|
||||
datalen i64
|
||||
link int
|
||||
info int
|
||||
align i64
|
||||
entsize i64
|
||||
}
|
||||
|
||||
fn (g mut Gen) section_header(c SectionConfig) {
|
||||
g.write32(g.sect_header_name_pos)
|
||||
g.sect_header_name_pos += c.name.len + 1
|
||||
g.write32(int(c.typ))
|
||||
g.write64(c.flags)
|
||||
g.write64(0) // sh_addr
|
||||
g.write64(g.offset)// offset
|
||||
g.offset += c.datalen+1
|
||||
g.write64(c.datalen)
|
||||
g.write32(c.link)
|
||||
g.write32(c.info)
|
||||
g.write64(c.align)
|
||||
g.write64(c.entsize)
|
||||
}
|
||||
|
||||
|
||||
fn genobj() {
|
||||
/*
|
||||
// SHN_UNDEF
|
||||
mut g := Gen{}
|
||||
nr_sections := 7
|
||||
g.section_header(SectionConfig{
|
||||
name: ''
|
||||
typ: .null
|
||||
flags:0
|
||||
data: 0
|
||||
is_saa: false
|
||||
link: 0
|
||||
info:0
|
||||
align:0
|
||||
entsize: 0
|
||||
})
|
||||
|
||||
/*
|
||||
for sect in sections {
|
||||
g.section_header(SectionConfig{
|
||||
name:0
|
||||
typ: sect.typ
|
||||
flags: sect.flags
|
||||
data: sect.data
|
||||
is_saa: true
|
||||
datalen: sect.len
|
||||
link: 0
|
||||
info: 0
|
||||
align: sect.align
|
||||
entsize: sect.entsize
|
||||
})
|
||||
|
||||
}
|
||||
*/
|
||||
|
||||
g.section_header(SectionConfig{
|
||||
name: '.DATA'
|
||||
typ: .progbits
|
||||
flags: 0x2
|
||||
//data: sect.data
|
||||
is_saa: true
|
||||
datalen: 0xd
|
||||
link: 0
|
||||
info: 0
|
||||
align: 1
|
||||
entsize: 0
|
||||
})
|
||||
|
||||
g.section_header(SectionConfig{
|
||||
name: '.TEXT'
|
||||
typ: .progbits
|
||||
flags: 0x2
|
||||
//data: sect.data
|
||||
is_saa: true
|
||||
datalen: 0xd
|
||||
link: 0
|
||||
info: 0
|
||||
align: 1
|
||||
entsize: 0
|
||||
})
|
||||
g.section_header(SectionConfig{
|
||||
name: '.shstrtab'
|
||||
typ: .strtab
|
||||
flags: 0x2
|
||||
//data: sect.data
|
||||
is_saa: true
|
||||
datalen: 0x22
|
||||
link: 0
|
||||
info: 0
|
||||
align: 1
|
||||
entsize: 0
|
||||
})
|
||||
g.section_header(SectionConfig{
|
||||
name: '.symtab'
|
||||
typ: .symtab
|
||||
flags: 0x2
|
||||
//data: sect.data
|
||||
is_saa: true
|
||||
datalen: 0xd
|
||||
link: 0
|
||||
info: 0
|
||||
align: 1
|
||||
entsize: 0
|
||||
})
|
||||
g.section_header(SectionConfig{
|
||||
name: '.strtab'
|
||||
typ: .symtab
|
||||
flags: 0x2
|
||||
//data: sect.data
|
||||
is_saa: true
|
||||
datalen: 0xd
|
||||
link: 0
|
||||
info: 0
|
||||
align: 1
|
||||
entsize: 0
|
||||
})
|
||||
g.section_header(SectionConfig{
|
||||
name: '.rela.TEXT'
|
||||
typ: .rela
|
||||
flags: 0x0
|
||||
//data: sect.data
|
||||
is_saa: true
|
||||
datalen: 0x18
|
||||
link: 4
|
||||
info: 2
|
||||
align: 8
|
||||
entsize: 0x18
|
||||
})
|
||||
*/
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user