mirror of
https://codeberg.org/ziglang/zig.git
synced 2025-12-06 13:54:21 +00:00
elf: finally move initMetadata into ZigObject.init
This commit is contained in:
parent
7d54c62c8a
commit
a6bf762a8b
2 changed files with 321 additions and 322 deletions
316
src/link/Elf.zig
316
src/link/Elf.zig
|
|
@ -387,8 +387,7 @@ pub fn createEmpty(
|
||||||
)}),
|
)}),
|
||||||
} });
|
} });
|
||||||
self.zig_object_index = index;
|
self.zig_object_index = index;
|
||||||
try self.zigObjectPtr().?.init(self);
|
try self.zigObjectPtr().?.init(self, .{
|
||||||
try self.initMetadata(.{
|
|
||||||
.symbol_count_hint = options.symbol_count_hint,
|
.symbol_count_hint = options.symbol_count_hint,
|
||||||
.program_code_size_hint = options.program_code_size_hint,
|
.program_code_size_hint = options.program_code_size_hint,
|
||||||
});
|
});
|
||||||
|
|
@ -574,315 +573,6 @@ pub fn findFreeSpace(self: *Elf, object_size: u64, min_alignment: u64) !u64 {
|
||||||
return start;
|
return start;
|
||||||
}
|
}
|
||||||
|
|
||||||
pub const InitMetadataOptions = struct {
|
|
||||||
symbol_count_hint: u64,
|
|
||||||
program_code_size_hint: u64,
|
|
||||||
};
|
|
||||||
|
|
||||||
/// TODO move to ZigObject
|
|
||||||
pub fn initMetadata(self: *Elf, options: InitMetadataOptions) !void {
|
|
||||||
const gpa = self.base.comp.gpa;
|
|
||||||
const ptr_size = self.ptrWidthBytes();
|
|
||||||
const target = self.base.comp.root_mod.resolved_target.result;
|
|
||||||
const ptr_bit_width = target.ptrBitWidth();
|
|
||||||
const zo = self.zigObjectPtr().?;
|
|
||||||
|
|
||||||
const fillSection = struct {
|
|
||||||
fn fillSection(elf_file: *Elf, shdr: *elf.Elf64_Shdr, size: u64, phndx: ?u16) !void {
|
|
||||||
if (elf_file.base.isRelocatable()) {
|
|
||||||
const off = try elf_file.findFreeSpace(size, shdr.sh_addralign);
|
|
||||||
shdr.sh_offset = off;
|
|
||||||
shdr.sh_size = size;
|
|
||||||
} else {
|
|
||||||
const phdr = elf_file.phdrs.items[phndx.?];
|
|
||||||
shdr.sh_addr = phdr.p_vaddr;
|
|
||||||
shdr.sh_offset = phdr.p_offset;
|
|
||||||
shdr.sh_size = phdr.p_memsz;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}.fillSection;
|
|
||||||
|
|
||||||
comptime assert(number_of_zig_segments == 5);
|
|
||||||
|
|
||||||
if (!self.base.isRelocatable()) {
|
|
||||||
if (self.phdr_zig_load_re_index == null) {
|
|
||||||
const filesz = options.program_code_size_hint;
|
|
||||||
const off = try self.findFreeSpace(filesz, self.page_size);
|
|
||||||
self.phdr_zig_load_re_index = try self.addPhdr(.{
|
|
||||||
.type = elf.PT_LOAD,
|
|
||||||
.offset = off,
|
|
||||||
.filesz = filesz,
|
|
||||||
.addr = if (ptr_bit_width >= 32) 0x4000000 else 0x4000,
|
|
||||||
.memsz = filesz,
|
|
||||||
.@"align" = self.page_size,
|
|
||||||
.flags = elf.PF_X | elf.PF_R | elf.PF_W,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
if (self.phdr_zig_load_ro_index == null) {
|
|
||||||
const alignment = self.page_size;
|
|
||||||
const filesz: u64 = 1024;
|
|
||||||
const off = try self.findFreeSpace(filesz, alignment);
|
|
||||||
self.phdr_zig_load_ro_index = try self.addPhdr(.{
|
|
||||||
.type = elf.PT_LOAD,
|
|
||||||
.offset = off,
|
|
||||||
.filesz = filesz,
|
|
||||||
.addr = if (ptr_bit_width >= 32) 0xc000000 else 0xa000,
|
|
||||||
.memsz = filesz,
|
|
||||||
.@"align" = alignment,
|
|
||||||
.flags = elf.PF_R | elf.PF_W,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
if (self.phdr_zig_load_rw_index == null) {
|
|
||||||
const alignment = self.page_size;
|
|
||||||
const filesz: u64 = 1024;
|
|
||||||
const off = try self.findFreeSpace(filesz, alignment);
|
|
||||||
self.phdr_zig_load_rw_index = try self.addPhdr(.{
|
|
||||||
.type = elf.PT_LOAD,
|
|
||||||
.offset = off,
|
|
||||||
.filesz = filesz,
|
|
||||||
.addr = if (ptr_bit_width >= 32) 0x10000000 else 0xc000,
|
|
||||||
.memsz = filesz,
|
|
||||||
.@"align" = alignment,
|
|
||||||
.flags = elf.PF_R | elf.PF_W,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
if (self.phdr_zig_load_zerofill_index == null) {
|
|
||||||
const alignment = self.page_size;
|
|
||||||
self.phdr_zig_load_zerofill_index = try self.addPhdr(.{
|
|
||||||
.type = elf.PT_LOAD,
|
|
||||||
.addr = if (ptr_bit_width >= 32) 0x14000000 else 0xf000,
|
|
||||||
.memsz = 1024,
|
|
||||||
.@"align" = alignment,
|
|
||||||
.flags = elf.PF_R | elf.PF_W,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (self.zig_text_section_index == null) {
|
|
||||||
self.zig_text_section_index = try self.addSection(.{
|
|
||||||
.name = try self.insertShString(".text.zig"),
|
|
||||||
.type = elf.SHT_PROGBITS,
|
|
||||||
.flags = elf.SHF_ALLOC | elf.SHF_EXECINSTR,
|
|
||||||
.addralign = 1,
|
|
||||||
.offset = std.math.maxInt(u64),
|
|
||||||
});
|
|
||||||
const shdr = &self.shdrs.items[self.zig_text_section_index.?];
|
|
||||||
try fillSection(self, shdr, options.program_code_size_hint, self.phdr_zig_load_re_index);
|
|
||||||
if (self.base.isRelocatable()) {
|
|
||||||
const rela_shndx = try self.addRelaShdr(try self.insertShString(".rela.text.zig"), self.zig_text_section_index.?);
|
|
||||||
try self.output_rela_sections.putNoClobber(gpa, self.zig_text_section_index.?, .{
|
|
||||||
.shndx = rela_shndx,
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
try self.phdr_to_shdr_table.putNoClobber(
|
|
||||||
gpa,
|
|
||||||
self.zig_text_section_index.?,
|
|
||||||
self.phdr_zig_load_re_index.?,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
try self.output_sections.putNoClobber(gpa, self.zig_text_section_index.?, .{});
|
|
||||||
try self.last_atom_and_free_list_table.putNoClobber(gpa, self.zig_text_section_index.?, .{});
|
|
||||||
}
|
|
||||||
|
|
||||||
if (self.zig_data_rel_ro_section_index == null) {
|
|
||||||
self.zig_data_rel_ro_section_index = try self.addSection(.{
|
|
||||||
.name = try self.insertShString(".data.rel.ro.zig"),
|
|
||||||
.type = elf.SHT_PROGBITS,
|
|
||||||
.addralign = 1,
|
|
||||||
.flags = elf.SHF_ALLOC | elf.SHF_WRITE,
|
|
||||||
.offset = std.math.maxInt(u64),
|
|
||||||
});
|
|
||||||
const shdr = &self.shdrs.items[self.zig_data_rel_ro_section_index.?];
|
|
||||||
try fillSection(self, shdr, 1024, self.phdr_zig_load_ro_index);
|
|
||||||
if (self.base.isRelocatable()) {
|
|
||||||
const rela_shndx = try self.addRelaShdr(
|
|
||||||
try self.insertShString(".rela.data.rel.ro.zig"),
|
|
||||||
self.zig_data_rel_ro_section_index.?,
|
|
||||||
);
|
|
||||||
try self.output_rela_sections.putNoClobber(gpa, self.zig_data_rel_ro_section_index.?, .{
|
|
||||||
.shndx = rela_shndx,
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
try self.phdr_to_shdr_table.putNoClobber(
|
|
||||||
gpa,
|
|
||||||
self.zig_data_rel_ro_section_index.?,
|
|
||||||
self.phdr_zig_load_ro_index.?,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
try self.output_sections.putNoClobber(gpa, self.zig_data_rel_ro_section_index.?, .{});
|
|
||||||
try self.last_atom_and_free_list_table.putNoClobber(gpa, self.zig_data_rel_ro_section_index.?, .{});
|
|
||||||
}
|
|
||||||
|
|
||||||
if (self.zig_data_section_index == null) {
|
|
||||||
self.zig_data_section_index = try self.addSection(.{
|
|
||||||
.name = try self.insertShString(".data.zig"),
|
|
||||||
.type = elf.SHT_PROGBITS,
|
|
||||||
.addralign = ptr_size,
|
|
||||||
.flags = elf.SHF_ALLOC | elf.SHF_WRITE,
|
|
||||||
.offset = std.math.maxInt(u64),
|
|
||||||
});
|
|
||||||
const shdr = &self.shdrs.items[self.zig_data_section_index.?];
|
|
||||||
try fillSection(self, shdr, 1024, self.phdr_zig_load_rw_index);
|
|
||||||
if (self.base.isRelocatable()) {
|
|
||||||
const rela_shndx = try self.addRelaShdr(
|
|
||||||
try self.insertShString(".rela.data.zig"),
|
|
||||||
self.zig_data_section_index.?,
|
|
||||||
);
|
|
||||||
try self.output_rela_sections.putNoClobber(gpa, self.zig_data_section_index.?, .{
|
|
||||||
.shndx = rela_shndx,
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
try self.phdr_to_shdr_table.putNoClobber(
|
|
||||||
gpa,
|
|
||||||
self.zig_data_section_index.?,
|
|
||||||
self.phdr_zig_load_rw_index.?,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
try self.output_sections.putNoClobber(gpa, self.zig_data_section_index.?, .{});
|
|
||||||
try self.last_atom_and_free_list_table.putNoClobber(gpa, self.zig_data_section_index.?, .{});
|
|
||||||
}
|
|
||||||
|
|
||||||
if (self.zig_bss_section_index == null) {
|
|
||||||
self.zig_bss_section_index = try self.addSection(.{
|
|
||||||
.name = try self.insertShString(".bss.zig"),
|
|
||||||
.type = elf.SHT_NOBITS,
|
|
||||||
.addralign = ptr_size,
|
|
||||||
.flags = elf.SHF_ALLOC | elf.SHF_WRITE,
|
|
||||||
.offset = 0,
|
|
||||||
});
|
|
||||||
const shdr = &self.shdrs.items[self.zig_bss_section_index.?];
|
|
||||||
if (self.phdr_zig_load_zerofill_index) |phndx| {
|
|
||||||
const phdr = self.phdrs.items[phndx];
|
|
||||||
shdr.sh_addr = phdr.p_vaddr;
|
|
||||||
shdr.sh_size = phdr.p_memsz;
|
|
||||||
try self.phdr_to_shdr_table.putNoClobber(gpa, self.zig_bss_section_index.?, phndx);
|
|
||||||
} else {
|
|
||||||
shdr.sh_size = 1024;
|
|
||||||
}
|
|
||||||
try self.output_sections.putNoClobber(gpa, self.zig_bss_section_index.?, .{});
|
|
||||||
try self.last_atom_and_free_list_table.putNoClobber(gpa, self.zig_bss_section_index.?, .{});
|
|
||||||
}
|
|
||||||
|
|
||||||
if (zo.dwarf) |*dwarf| {
|
|
||||||
const addSectionSymbol = struct {
|
|
||||||
fn addSectionSymbol(
|
|
||||||
zig_object: *ZigObject,
|
|
||||||
alloc: Allocator,
|
|
||||||
name: [:0]const u8,
|
|
||||||
alignment: Atom.Alignment,
|
|
||||||
shndx: u32,
|
|
||||||
) !Symbol.Index {
|
|
||||||
const name_off = try zig_object.addString(alloc, name);
|
|
||||||
const index = try zig_object.newSymbolWithAtom(alloc, name_off);
|
|
||||||
const sym = zig_object.symbol(index);
|
|
||||||
const esym = &zig_object.symtab.items(.elf_sym)[sym.esym_index];
|
|
||||||
esym.st_info |= elf.STT_SECTION;
|
|
||||||
const atom_ptr = zig_object.atom(sym.ref.index).?;
|
|
||||||
atom_ptr.alignment = alignment;
|
|
||||||
atom_ptr.output_section_index = shndx;
|
|
||||||
return index;
|
|
||||||
}
|
|
||||||
}.addSectionSymbol;
|
|
||||||
|
|
||||||
if (self.debug_str_section_index == null) {
|
|
||||||
self.debug_str_section_index = try self.addSection(.{
|
|
||||||
.name = try self.insertShString(".debug_str"),
|
|
||||||
.flags = elf.SHF_MERGE | elf.SHF_STRINGS,
|
|
||||||
.entsize = 1,
|
|
||||||
.type = elf.SHT_PROGBITS,
|
|
||||||
.addralign = 1,
|
|
||||||
});
|
|
||||||
zo.debug_str_section_dirty = true;
|
|
||||||
zo.debug_str_index = try addSectionSymbol(zo, gpa, ".debug_str", .@"1", self.debug_str_section_index.?);
|
|
||||||
try self.output_sections.putNoClobber(gpa, self.debug_str_section_index.?, .{});
|
|
||||||
}
|
|
||||||
|
|
||||||
if (self.debug_info_section_index == null) {
|
|
||||||
self.debug_info_section_index = try self.addSection(.{
|
|
||||||
.name = try self.insertShString(".debug_info"),
|
|
||||||
.type = elf.SHT_PROGBITS,
|
|
||||||
.addralign = 1,
|
|
||||||
});
|
|
||||||
zo.debug_info_section_dirty = true;
|
|
||||||
zo.debug_info_index = try addSectionSymbol(zo, gpa, ".debug_info", .@"1", self.debug_info_section_index.?);
|
|
||||||
try self.output_sections.putNoClobber(gpa, self.debug_info_section_index.?, .{});
|
|
||||||
}
|
|
||||||
|
|
||||||
if (self.debug_abbrev_section_index == null) {
|
|
||||||
self.debug_abbrev_section_index = try self.addSection(.{
|
|
||||||
.name = try self.insertShString(".debug_abbrev"),
|
|
||||||
.type = elf.SHT_PROGBITS,
|
|
||||||
.addralign = 1,
|
|
||||||
});
|
|
||||||
zo.debug_abbrev_section_dirty = true;
|
|
||||||
zo.debug_abbrev_index = try addSectionSymbol(zo, gpa, ".debug_abbrev", .@"1", self.debug_abbrev_section_index.?);
|
|
||||||
try self.output_sections.putNoClobber(gpa, self.debug_abbrev_section_index.?, .{});
|
|
||||||
}
|
|
||||||
|
|
||||||
if (self.debug_aranges_section_index == null) {
|
|
||||||
self.debug_aranges_section_index = try self.addSection(.{
|
|
||||||
.name = try self.insertShString(".debug_aranges"),
|
|
||||||
.type = elf.SHT_PROGBITS,
|
|
||||||
.addralign = 16,
|
|
||||||
});
|
|
||||||
zo.debug_aranges_section_dirty = true;
|
|
||||||
zo.debug_aranges_index = try addSectionSymbol(zo, gpa, ".debug_aranges", .@"16", self.debug_aranges_section_index.?);
|
|
||||||
try self.output_sections.putNoClobber(gpa, self.debug_aranges_section_index.?, .{});
|
|
||||||
}
|
|
||||||
|
|
||||||
if (self.debug_line_section_index == null) {
|
|
||||||
self.debug_line_section_index = try self.addSection(.{
|
|
||||||
.name = try self.insertShString(".debug_line"),
|
|
||||||
.type = elf.SHT_PROGBITS,
|
|
||||||
.addralign = 1,
|
|
||||||
});
|
|
||||||
zo.debug_line_section_dirty = true;
|
|
||||||
zo.debug_line_index = try addSectionSymbol(zo, gpa, ".debug_line", .@"1", self.debug_line_section_index.?);
|
|
||||||
try self.output_sections.putNoClobber(gpa, self.debug_line_section_index.?, .{});
|
|
||||||
}
|
|
||||||
|
|
||||||
if (self.debug_line_str_section_index == null) {
|
|
||||||
self.debug_line_str_section_index = try self.addSection(.{
|
|
||||||
.name = try self.insertShString(".debug_line_str"),
|
|
||||||
.flags = elf.SHF_MERGE | elf.SHF_STRINGS,
|
|
||||||
.entsize = 1,
|
|
||||||
.type = elf.SHT_PROGBITS,
|
|
||||||
.addralign = 1,
|
|
||||||
});
|
|
||||||
zo.debug_line_str_section_dirty = true;
|
|
||||||
zo.debug_line_str_index = try addSectionSymbol(zo, gpa, ".debug_line_str", .@"1", self.debug_line_str_section_index.?);
|
|
||||||
try self.output_sections.putNoClobber(gpa, self.debug_line_str_section_index.?, .{});
|
|
||||||
}
|
|
||||||
|
|
||||||
if (self.debug_loclists_section_index == null) {
|
|
||||||
self.debug_loclists_section_index = try self.addSection(.{
|
|
||||||
.name = try self.insertShString(".debug_loclists"),
|
|
||||||
.type = elf.SHT_PROGBITS,
|
|
||||||
.addralign = 1,
|
|
||||||
});
|
|
||||||
zo.debug_loclists_section_dirty = true;
|
|
||||||
zo.debug_loclists_index = try addSectionSymbol(zo, gpa, ".debug_loclists", .@"1", self.debug_loclists_section_index.?);
|
|
||||||
try self.output_sections.putNoClobber(gpa, self.debug_loclists_section_index.?, .{});
|
|
||||||
}
|
|
||||||
|
|
||||||
if (self.debug_rnglists_section_index == null) {
|
|
||||||
self.debug_rnglists_section_index = try self.addSection(.{
|
|
||||||
.name = try self.insertShString(".debug_rnglists"),
|
|
||||||
.type = elf.SHT_PROGBITS,
|
|
||||||
.addralign = 1,
|
|
||||||
});
|
|
||||||
zo.debug_rnglists_section_dirty = true;
|
|
||||||
zo.debug_rnglists_index = try addSectionSymbol(zo, gpa, ".debug_rnglists", .@"1", self.debug_rnglists_section_index.?);
|
|
||||||
try self.output_sections.putNoClobber(gpa, self.debug_rnglists_section_index.?, .{});
|
|
||||||
}
|
|
||||||
|
|
||||||
try dwarf.initMetadata();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn growAllocSection(self: *Elf, shdr_index: u32, needed_size: u64) !void {
|
pub fn growAllocSection(self: *Elf, shdr_index: u32, needed_size: u64) !void {
|
||||||
const shdr = &self.shdrs.items[shdr_index];
|
const shdr = &self.shdrs.items[shdr_index];
|
||||||
const maybe_phdr = if (self.phdr_to_shdr_table.get(shdr_index)) |phndx| &self.phdrs.items[phndx] else null;
|
const maybe_phdr = if (self.phdr_to_shdr_table.get(shdr_index)) |phndx| &self.phdrs.items[phndx] else null;
|
||||||
|
|
@ -5069,7 +4759,7 @@ pub fn isDebugSection(self: Elf, shndx: u32) bool {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
fn addPhdr(self: *Elf, opts: struct {
|
pub fn addPhdr(self: *Elf, opts: struct {
|
||||||
type: u32 = 0,
|
type: u32 = 0,
|
||||||
flags: u32 = 0,
|
flags: u32 = 0,
|
||||||
@"align": u64 = 0,
|
@"align": u64 = 0,
|
||||||
|
|
@ -5746,7 +5436,7 @@ fn requiresThunks(self: Elf) bool {
|
||||||
/// so that we reserve enough space for the program header table up-front.
|
/// so that we reserve enough space for the program header table up-front.
|
||||||
/// Bump these numbers when adding or deleting a Zig specific pre-allocated segment, or adding
|
/// Bump these numbers when adding or deleting a Zig specific pre-allocated segment, or adding
|
||||||
/// more special-purpose program headers.
|
/// more special-purpose program headers.
|
||||||
const number_of_zig_segments = 5;
|
pub const number_of_zig_segments = 4;
|
||||||
const max_number_of_object_segments = 9;
|
const max_number_of_object_segments = 9;
|
||||||
const max_number_of_special_phdrs = 5;
|
const max_number_of_special_phdrs = 5;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -63,24 +63,333 @@ pub const global_symbol_bit: u32 = 0x80000000;
|
||||||
pub const symbol_mask: u32 = 0x7fffffff;
|
pub const symbol_mask: u32 = 0x7fffffff;
|
||||||
pub const SHN_ATOM: u16 = 0x100;
|
pub const SHN_ATOM: u16 = 0x100;
|
||||||
|
|
||||||
pub fn init(self: *ZigObject, elf_file: *Elf) !void {
|
const InitOptions = struct {
|
||||||
|
symbol_count_hint: u64,
|
||||||
|
program_code_size_hint: u64,
|
||||||
|
};
|
||||||
|
|
||||||
|
pub fn init(self: *ZigObject, elf_file: *Elf, options: InitOptions) !void {
|
||||||
const comp = elf_file.base.comp;
|
const comp = elf_file.base.comp;
|
||||||
const gpa = comp.gpa;
|
const gpa = comp.gpa;
|
||||||
|
const ptr_size = elf_file.ptrWidthBytes();
|
||||||
|
const target = elf_file.getTarget();
|
||||||
|
const ptr_bit_width = target.ptrBitWidth();
|
||||||
|
|
||||||
try self.atoms.append(gpa, .{ .extra_index = try self.addAtomExtra(gpa, .{}) }); // null input section
|
try self.atoms.append(gpa, .{ .extra_index = try self.addAtomExtra(gpa, .{}) }); // null input section
|
||||||
try self.relocs.append(gpa, .{}); // null relocs section
|
try self.relocs.append(gpa, .{}); // null relocs section
|
||||||
try self.strtab.buffer.append(gpa, 0);
|
try self.strtab.buffer.append(gpa, 0);
|
||||||
|
|
||||||
const name_off = try self.strtab.insert(gpa, self.path);
|
{
|
||||||
const symbol_index = try self.newLocalSymbol(gpa, name_off);
|
const name_off = try self.strtab.insert(gpa, self.path);
|
||||||
const sym = self.symbol(symbol_index);
|
const symbol_index = try self.newLocalSymbol(gpa, name_off);
|
||||||
const esym = &self.symtab.items(.elf_sym)[sym.esym_index];
|
const sym = self.symbol(symbol_index);
|
||||||
esym.st_info = elf.STT_FILE;
|
const esym = &self.symtab.items(.elf_sym)[sym.esym_index];
|
||||||
esym.st_shndx = elf.SHN_ABS;
|
esym.st_info = elf.STT_FILE;
|
||||||
|
esym.st_shndx = elf.SHN_ABS;
|
||||||
|
}
|
||||||
|
|
||||||
|
const fillSection = struct {
|
||||||
|
fn fillSection(ef: *Elf, shdr: *elf.Elf64_Shdr, size: u64, phndx: ?u16) !void {
|
||||||
|
if (ef.base.isRelocatable()) {
|
||||||
|
const off = try ef.findFreeSpace(size, shdr.sh_addralign);
|
||||||
|
shdr.sh_offset = off;
|
||||||
|
shdr.sh_size = size;
|
||||||
|
} else {
|
||||||
|
const phdr = ef.phdrs.items[phndx.?];
|
||||||
|
shdr.sh_addr = phdr.p_vaddr;
|
||||||
|
shdr.sh_offset = phdr.p_offset;
|
||||||
|
shdr.sh_size = phdr.p_memsz;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}.fillSection;
|
||||||
|
|
||||||
|
comptime assert(Elf.number_of_zig_segments == 4);
|
||||||
|
|
||||||
|
if (!elf_file.base.isRelocatable()) {
|
||||||
|
if (elf_file.phdr_zig_load_re_index == null) {
|
||||||
|
const filesz = options.program_code_size_hint;
|
||||||
|
const off = try elf_file.findFreeSpace(filesz, elf_file.page_size);
|
||||||
|
elf_file.phdr_zig_load_re_index = try elf_file.addPhdr(.{
|
||||||
|
.type = elf.PT_LOAD,
|
||||||
|
.offset = off,
|
||||||
|
.filesz = filesz,
|
||||||
|
.addr = if (ptr_bit_width >= 32) 0x4000000 else 0x4000,
|
||||||
|
.memsz = filesz,
|
||||||
|
.@"align" = elf_file.page_size,
|
||||||
|
.flags = elf.PF_X | elf.PF_R | elf.PF_W,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (elf_file.phdr_zig_load_ro_index == null) {
|
||||||
|
const alignment = elf_file.page_size;
|
||||||
|
const filesz: u64 = 1024;
|
||||||
|
const off = try elf_file.findFreeSpace(filesz, alignment);
|
||||||
|
elf_file.phdr_zig_load_ro_index = try elf_file.addPhdr(.{
|
||||||
|
.type = elf.PT_LOAD,
|
||||||
|
.offset = off,
|
||||||
|
.filesz = filesz,
|
||||||
|
.addr = if (ptr_bit_width >= 32) 0xc000000 else 0xa000,
|
||||||
|
.memsz = filesz,
|
||||||
|
.@"align" = alignment,
|
||||||
|
.flags = elf.PF_R | elf.PF_W,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (elf_file.phdr_zig_load_rw_index == null) {
|
||||||
|
const alignment = elf_file.page_size;
|
||||||
|
const filesz: u64 = 1024;
|
||||||
|
const off = try elf_file.findFreeSpace(filesz, alignment);
|
||||||
|
elf_file.phdr_zig_load_rw_index = try elf_file.addPhdr(.{
|
||||||
|
.type = elf.PT_LOAD,
|
||||||
|
.offset = off,
|
||||||
|
.filesz = filesz,
|
||||||
|
.addr = if (ptr_bit_width >= 32) 0x10000000 else 0xc000,
|
||||||
|
.memsz = filesz,
|
||||||
|
.@"align" = alignment,
|
||||||
|
.flags = elf.PF_R | elf.PF_W,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (elf_file.phdr_zig_load_zerofill_index == null) {
|
||||||
|
const alignment = elf_file.page_size;
|
||||||
|
elf_file.phdr_zig_load_zerofill_index = try elf_file.addPhdr(.{
|
||||||
|
.type = elf.PT_LOAD,
|
||||||
|
.addr = if (ptr_bit_width >= 32) 0x14000000 else 0xf000,
|
||||||
|
.memsz = 1024,
|
||||||
|
.@"align" = alignment,
|
||||||
|
.flags = elf.PF_R | elf.PF_W,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (elf_file.zig_text_section_index == null) {
|
||||||
|
elf_file.zig_text_section_index = try elf_file.addSection(.{
|
||||||
|
.name = try elf_file.insertShString(".text.zig"),
|
||||||
|
.type = elf.SHT_PROGBITS,
|
||||||
|
.flags = elf.SHF_ALLOC | elf.SHF_EXECINSTR,
|
||||||
|
.addralign = 1,
|
||||||
|
.offset = std.math.maxInt(u64),
|
||||||
|
});
|
||||||
|
const shdr = &elf_file.shdrs.items[elf_file.zig_text_section_index.?];
|
||||||
|
try fillSection(elf_file, shdr, options.program_code_size_hint, elf_file.phdr_zig_load_re_index);
|
||||||
|
if (elf_file.base.isRelocatable()) {
|
||||||
|
const rela_shndx = try elf_file.addRelaShdr(
|
||||||
|
try elf_file.insertShString(".rela.text.zig"),
|
||||||
|
elf_file.zig_text_section_index.?,
|
||||||
|
);
|
||||||
|
try elf_file.output_rela_sections.putNoClobber(gpa, elf_file.zig_text_section_index.?, .{
|
||||||
|
.shndx = rela_shndx,
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
try elf_file.phdr_to_shdr_table.putNoClobber(
|
||||||
|
gpa,
|
||||||
|
elf_file.zig_text_section_index.?,
|
||||||
|
elf_file.phdr_zig_load_re_index.?,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
try elf_file.output_sections.putNoClobber(gpa, elf_file.zig_text_section_index.?, .{});
|
||||||
|
try elf_file.last_atom_and_free_list_table.putNoClobber(gpa, elf_file.zig_text_section_index.?, .{});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (elf_file.zig_data_rel_ro_section_index == null) {
|
||||||
|
elf_file.zig_data_rel_ro_section_index = try elf_file.addSection(.{
|
||||||
|
.name = try elf_file.insertShString(".data.rel.ro.zig"),
|
||||||
|
.type = elf.SHT_PROGBITS,
|
||||||
|
.addralign = 1,
|
||||||
|
.flags = elf.SHF_ALLOC | elf.SHF_WRITE,
|
||||||
|
.offset = std.math.maxInt(u64),
|
||||||
|
});
|
||||||
|
const shdr = &elf_file.shdrs.items[elf_file.zig_data_rel_ro_section_index.?];
|
||||||
|
try fillSection(elf_file, shdr, 1024, elf_file.phdr_zig_load_ro_index);
|
||||||
|
if (elf_file.base.isRelocatable()) {
|
||||||
|
const rela_shndx = try elf_file.addRelaShdr(
|
||||||
|
try elf_file.insertShString(".rela.data.rel.ro.zig"),
|
||||||
|
elf_file.zig_data_rel_ro_section_index.?,
|
||||||
|
);
|
||||||
|
try elf_file.output_rela_sections.putNoClobber(gpa, elf_file.zig_data_rel_ro_section_index.?, .{
|
||||||
|
.shndx = rela_shndx,
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
try elf_file.phdr_to_shdr_table.putNoClobber(
|
||||||
|
gpa,
|
||||||
|
elf_file.zig_data_rel_ro_section_index.?,
|
||||||
|
elf_file.phdr_zig_load_ro_index.?,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
try elf_file.output_sections.putNoClobber(gpa, elf_file.zig_data_rel_ro_section_index.?, .{});
|
||||||
|
try elf_file.last_atom_and_free_list_table.putNoClobber(gpa, elf_file.zig_data_rel_ro_section_index.?, .{});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (elf_file.zig_data_section_index == null) {
|
||||||
|
elf_file.zig_data_section_index = try elf_file.addSection(.{
|
||||||
|
.name = try elf_file.insertShString(".data.zig"),
|
||||||
|
.type = elf.SHT_PROGBITS,
|
||||||
|
.addralign = ptr_size,
|
||||||
|
.flags = elf.SHF_ALLOC | elf.SHF_WRITE,
|
||||||
|
.offset = std.math.maxInt(u64),
|
||||||
|
});
|
||||||
|
const shdr = &elf_file.shdrs.items[elf_file.zig_data_section_index.?];
|
||||||
|
try fillSection(elf_file, shdr, 1024, elf_file.phdr_zig_load_rw_index);
|
||||||
|
if (elf_file.base.isRelocatable()) {
|
||||||
|
const rela_shndx = try elf_file.addRelaShdr(
|
||||||
|
try elf_file.insertShString(".rela.data.zig"),
|
||||||
|
elf_file.zig_data_section_index.?,
|
||||||
|
);
|
||||||
|
try elf_file.output_rela_sections.putNoClobber(gpa, elf_file.zig_data_section_index.?, .{
|
||||||
|
.shndx = rela_shndx,
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
try elf_file.phdr_to_shdr_table.putNoClobber(
|
||||||
|
gpa,
|
||||||
|
elf_file.zig_data_section_index.?,
|
||||||
|
elf_file.phdr_zig_load_rw_index.?,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
try elf_file.output_sections.putNoClobber(gpa, elf_file.zig_data_section_index.?, .{});
|
||||||
|
try elf_file.last_atom_and_free_list_table.putNoClobber(gpa, elf_file.zig_data_section_index.?, .{});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (elf_file.zig_bss_section_index == null) {
|
||||||
|
elf_file.zig_bss_section_index = try elf_file.addSection(.{
|
||||||
|
.name = try elf_file.insertShString(".bss.zig"),
|
||||||
|
.type = elf.SHT_NOBITS,
|
||||||
|
.addralign = ptr_size,
|
||||||
|
.flags = elf.SHF_ALLOC | elf.SHF_WRITE,
|
||||||
|
.offset = 0,
|
||||||
|
});
|
||||||
|
const shdr = &elf_file.shdrs.items[elf_file.zig_bss_section_index.?];
|
||||||
|
if (elf_file.phdr_zig_load_zerofill_index) |phndx| {
|
||||||
|
const phdr = elf_file.phdrs.items[phndx];
|
||||||
|
shdr.sh_addr = phdr.p_vaddr;
|
||||||
|
shdr.sh_size = phdr.p_memsz;
|
||||||
|
try elf_file.phdr_to_shdr_table.putNoClobber(gpa, elf_file.zig_bss_section_index.?, phndx);
|
||||||
|
} else {
|
||||||
|
shdr.sh_size = 1024;
|
||||||
|
}
|
||||||
|
try elf_file.output_sections.putNoClobber(gpa, elf_file.zig_bss_section_index.?, .{});
|
||||||
|
try elf_file.last_atom_and_free_list_table.putNoClobber(gpa, elf_file.zig_bss_section_index.?, .{});
|
||||||
|
}
|
||||||
|
|
||||||
switch (comp.config.debug_format) {
|
switch (comp.config.debug_format) {
|
||||||
.strip => {},
|
.strip => {},
|
||||||
.dwarf => |v| self.dwarf = Dwarf.init(&elf_file.base, v),
|
.dwarf => |v| {
|
||||||
|
var dwarf = Dwarf.init(&elf_file.base, v);
|
||||||
|
|
||||||
|
const addSectionSymbol = struct {
|
||||||
|
fn addSectionSymbol(
|
||||||
|
zig_object: *ZigObject,
|
||||||
|
alloc: Allocator,
|
||||||
|
name: [:0]const u8,
|
||||||
|
alignment: Atom.Alignment,
|
||||||
|
shndx: u32,
|
||||||
|
) !Symbol.Index {
|
||||||
|
const name_off = try zig_object.addString(alloc, name);
|
||||||
|
const index = try zig_object.newSymbolWithAtom(alloc, name_off);
|
||||||
|
const sym = zig_object.symbol(index);
|
||||||
|
const esym = &zig_object.symtab.items(.elf_sym)[sym.esym_index];
|
||||||
|
esym.st_info |= elf.STT_SECTION;
|
||||||
|
const atom_ptr = zig_object.atom(sym.ref.index).?;
|
||||||
|
atom_ptr.alignment = alignment;
|
||||||
|
atom_ptr.output_section_index = shndx;
|
||||||
|
return index;
|
||||||
|
}
|
||||||
|
}.addSectionSymbol;
|
||||||
|
|
||||||
|
if (elf_file.debug_str_section_index == null) {
|
||||||
|
elf_file.debug_str_section_index = try elf_file.addSection(.{
|
||||||
|
.name = try elf_file.insertShString(".debug_str"),
|
||||||
|
.flags = elf.SHF_MERGE | elf.SHF_STRINGS,
|
||||||
|
.entsize = 1,
|
||||||
|
.type = elf.SHT_PROGBITS,
|
||||||
|
.addralign = 1,
|
||||||
|
});
|
||||||
|
self.debug_str_section_dirty = true;
|
||||||
|
self.debug_str_index = try addSectionSymbol(self, gpa, ".debug_str", .@"1", elf_file.debug_str_section_index.?);
|
||||||
|
try elf_file.output_sections.putNoClobber(gpa, elf_file.debug_str_section_index.?, .{});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (elf_file.debug_info_section_index == null) {
|
||||||
|
elf_file.debug_info_section_index = try elf_file.addSection(.{
|
||||||
|
.name = try elf_file.insertShString(".debug_info"),
|
||||||
|
.type = elf.SHT_PROGBITS,
|
||||||
|
.addralign = 1,
|
||||||
|
});
|
||||||
|
self.debug_info_section_dirty = true;
|
||||||
|
self.debug_info_index = try addSectionSymbol(self, gpa, ".debug_info", .@"1", elf_file.debug_info_section_index.?);
|
||||||
|
try elf_file.output_sections.putNoClobber(gpa, elf_file.debug_info_section_index.?, .{});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (elf_file.debug_abbrev_section_index == null) {
|
||||||
|
elf_file.debug_abbrev_section_index = try elf_file.addSection(.{
|
||||||
|
.name = try elf_file.insertShString(".debug_abbrev"),
|
||||||
|
.type = elf.SHT_PROGBITS,
|
||||||
|
.addralign = 1,
|
||||||
|
});
|
||||||
|
self.debug_abbrev_section_dirty = true;
|
||||||
|
self.debug_abbrev_index = try addSectionSymbol(self, gpa, ".debug_abbrev", .@"1", elf_file.debug_abbrev_section_index.?);
|
||||||
|
try elf_file.output_sections.putNoClobber(gpa, elf_file.debug_abbrev_section_index.?, .{});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (elf_file.debug_aranges_section_index == null) {
|
||||||
|
elf_file.debug_aranges_section_index = try elf_file.addSection(.{
|
||||||
|
.name = try elf_file.insertShString(".debug_aranges"),
|
||||||
|
.type = elf.SHT_PROGBITS,
|
||||||
|
.addralign = 16,
|
||||||
|
});
|
||||||
|
self.debug_aranges_section_dirty = true;
|
||||||
|
self.debug_aranges_index = try addSectionSymbol(self, gpa, ".debug_aranges", .@"16", elf_file.debug_aranges_section_index.?);
|
||||||
|
try elf_file.output_sections.putNoClobber(gpa, elf_file.debug_aranges_section_index.?, .{});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (elf_file.debug_line_section_index == null) {
|
||||||
|
elf_file.debug_line_section_index = try elf_file.addSection(.{
|
||||||
|
.name = try elf_file.insertShString(".debug_line"),
|
||||||
|
.type = elf.SHT_PROGBITS,
|
||||||
|
.addralign = 1,
|
||||||
|
});
|
||||||
|
self.debug_line_section_dirty = true;
|
||||||
|
self.debug_line_index = try addSectionSymbol(self, gpa, ".debug_line", .@"1", elf_file.debug_line_section_index.?);
|
||||||
|
try elf_file.output_sections.putNoClobber(gpa, elf_file.debug_line_section_index.?, .{});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (elf_file.debug_line_str_section_index == null) {
|
||||||
|
elf_file.debug_line_str_section_index = try elf_file.addSection(.{
|
||||||
|
.name = try elf_file.insertShString(".debug_line_str"),
|
||||||
|
.flags = elf.SHF_MERGE | elf.SHF_STRINGS,
|
||||||
|
.entsize = 1,
|
||||||
|
.type = elf.SHT_PROGBITS,
|
||||||
|
.addralign = 1,
|
||||||
|
});
|
||||||
|
self.debug_line_str_section_dirty = true;
|
||||||
|
self.debug_line_str_index = try addSectionSymbol(self, gpa, ".debug_line_str", .@"1", elf_file.debug_line_str_section_index.?);
|
||||||
|
try elf_file.output_sections.putNoClobber(gpa, elf_file.debug_line_str_section_index.?, .{});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (elf_file.debug_loclists_section_index == null) {
|
||||||
|
elf_file.debug_loclists_section_index = try elf_file.addSection(.{
|
||||||
|
.name = try elf_file.insertShString(".debug_loclists"),
|
||||||
|
.type = elf.SHT_PROGBITS,
|
||||||
|
.addralign = 1,
|
||||||
|
});
|
||||||
|
self.debug_loclists_section_dirty = true;
|
||||||
|
self.debug_loclists_index = try addSectionSymbol(self, gpa, ".debug_loclists", .@"1", elf_file.debug_loclists_section_index.?);
|
||||||
|
try elf_file.output_sections.putNoClobber(gpa, elf_file.debug_loclists_section_index.?, .{});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (elf_file.debug_rnglists_section_index == null) {
|
||||||
|
elf_file.debug_rnglists_section_index = try elf_file.addSection(.{
|
||||||
|
.name = try elf_file.insertShString(".debug_rnglists"),
|
||||||
|
.type = elf.SHT_PROGBITS,
|
||||||
|
.addralign = 1,
|
||||||
|
});
|
||||||
|
self.debug_rnglists_section_dirty = true;
|
||||||
|
self.debug_rnglists_index = try addSectionSymbol(self, gpa, ".debug_rnglists", .@"1", elf_file.debug_rnglists_section_index.?);
|
||||||
|
try elf_file.output_sections.putNoClobber(gpa, elf_file.debug_rnglists_section_index.?, .{});
|
||||||
|
}
|
||||||
|
|
||||||
|
try dwarf.initMetadata();
|
||||||
|
self.dwarf = dwarf;
|
||||||
|
},
|
||||||
.code_view => unreachable,
|
.code_view => unreachable,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -446,7 +755,7 @@ fn newAtom(self: *ZigObject, allocator: Allocator, name_off: u32) !Atom.Index {
|
||||||
return index;
|
return index;
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn newSymbolWithAtom(self: *ZigObject, allocator: Allocator, name_off: u32) !Symbol.Index {
|
fn newSymbolWithAtom(self: *ZigObject, allocator: Allocator, name_off: u32) !Symbol.Index {
|
||||||
const atom_index = try self.newAtom(allocator, name_off);
|
const atom_index = try self.newAtom(allocator, name_off);
|
||||||
const sym_index = try self.newLocalSymbol(allocator, name_off);
|
const sym_index = try self.newLocalSymbol(allocator, name_off);
|
||||||
const sym = self.symbol(sym_index);
|
const sym = self.symbol(sym_index);
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue