mirror of
https://github.com/ziglang/zig.git
synced 2025-12-06 06:13:07 +00:00
Elf2: emit object files that are slightly more object-like
This commit is contained in:
parent
5358af7ba4
commit
7bcefe5a22
@ -715,7 +715,13 @@ fn initHeaders(
|
||||
break :phndx phnum;
|
||||
} else undefined;
|
||||
|
||||
const expected_nodes_len = expected_nodes_len: {
|
||||
const expected_nodes_len = 5 + phnum * 2 + @as(usize, 2) * @intFromBool(have_dynamic_section);
|
||||
if (@"type" != .REL) break :expected_nodes_len expected_nodes_len;
|
||||
phnum = 0;
|
||||
break :expected_nodes_len expected_nodes_len -
|
||||
@intFromBool(comp.config.any_non_single_threaded);
|
||||
};
|
||||
try elf.nodes.ensureTotalCapacity(gpa, expected_nodes_len);
|
||||
try elf.phdrs.resize(gpa, phnum);
|
||||
elf.nodes.appendAssumeCapacity(.file);
|
||||
@ -767,37 +773,37 @@ fn initHeaders(
|
||||
|
||||
assert(elf.ni.rodata == try elf.mf.addLastChildNode(gpa, elf.ni.file, .{
|
||||
.alignment = elf.mf.flags.block_size,
|
||||
.moved = true,
|
||||
.moved = @"type" != .REL,
|
||||
.bubbles_moved = false,
|
||||
}));
|
||||
elf.nodes.appendAssumeCapacity(.{ .segment = rodata_phndx });
|
||||
elf.phdrs.items[rodata_phndx] = elf.ni.rodata;
|
||||
if (@"type" != .REL) elf.phdrs.items[rodata_phndx] = elf.ni.rodata;
|
||||
|
||||
assert(elf.ni.phdr == try elf.mf.addOnlyChildNode(gpa, elf.ni.rodata, .{
|
||||
.size = elf.ehdrField(.phentsize) * elf.ehdrField(.phnum),
|
||||
.alignment = addr_align,
|
||||
.moved = true,
|
||||
.resized = true,
|
||||
.moved = @"type" != .REL,
|
||||
.resized = @"type" != .REL,
|
||||
.bubbles_moved = false,
|
||||
}));
|
||||
elf.nodes.appendAssumeCapacity(.{ .segment = phdr_phndx });
|
||||
elf.phdrs.items[phdr_phndx] = elf.ni.phdr;
|
||||
if (@"type" != .REL) elf.phdrs.items[phdr_phndx] = elf.ni.phdr;
|
||||
|
||||
assert(elf.ni.text == try elf.mf.addLastChildNode(gpa, elf.ni.file, .{
|
||||
.alignment = elf.mf.flags.block_size,
|
||||
.moved = true,
|
||||
.moved = @"type" != .REL,
|
||||
.bubbles_moved = false,
|
||||
}));
|
||||
elf.nodes.appendAssumeCapacity(.{ .segment = text_phndx });
|
||||
elf.phdrs.items[text_phndx] = elf.ni.text;
|
||||
if (@"type" != .REL) elf.phdrs.items[text_phndx] = elf.ni.text;
|
||||
|
||||
assert(elf.ni.data == try elf.mf.addLastChildNode(gpa, elf.ni.file, .{
|
||||
.alignment = elf.mf.flags.block_size,
|
||||
.moved = true,
|
||||
.moved = @"type" != .REL,
|
||||
.bubbles_moved = false,
|
||||
}));
|
||||
elf.nodes.appendAssumeCapacity(.{ .segment = data_phndx });
|
||||
elf.phdrs.items[data_phndx] = elf.ni.data;
|
||||
if (@"type" != .REL) elf.phdrs.items[data_phndx] = elf.ni.data;
|
||||
|
||||
var ph_vaddr: u32 = switch (elf.ehdrField(.type)) {
|
||||
else => 0,
|
||||
@ -816,6 +822,7 @@ fn initHeaders(
|
||||
const ElfN = ct_class.ElfN();
|
||||
const target_endian = elf.targetEndian();
|
||||
|
||||
if (@"type" != .REL) {
|
||||
const phdr: []ElfN.Phdr = @ptrCast(@alignCast(elf.ni.phdr.slice(&elf.mf)));
|
||||
const ph_phdr = &phdr[phdr_phndx];
|
||||
ph_phdr.* = .{
|
||||
@ -919,6 +926,7 @@ fn initHeaders(
|
||||
};
|
||||
if (target_endian != native_endian) std.mem.byteSwapAllFields(ElfN.Phdr, ph_tls);
|
||||
}
|
||||
}
|
||||
|
||||
const sh_null: *ElfN.Shdr = @ptrCast(@alignCast(elf.ni.shdr.slice(&elf.mf)));
|
||||
sh_null.* = .{
|
||||
@ -982,17 +990,17 @@ fn initHeaders(
|
||||
try elf.linkSections(.symtab, .strtab);
|
||||
elf.si.strtab.node(elf).slice(&elf.mf)[0] = 0;
|
||||
|
||||
assert(elf.si.rodata == try elf.addSection(elf.ni.rodata, .{
|
||||
assert(elf.si.rodata == try elf.addSection(if (@"type" != .REL) elf.ni.rodata else elf.ni.file, .{
|
||||
.name = ".rodata",
|
||||
.flags = .{ .ALLOC = true },
|
||||
.addralign = elf.mf.flags.block_size,
|
||||
}));
|
||||
assert(elf.si.text == try elf.addSection(elf.ni.text, .{
|
||||
assert(elf.si.text == try elf.addSection(if (@"type" != .REL) elf.ni.text else elf.ni.file, .{
|
||||
.name = ".text",
|
||||
.flags = .{ .ALLOC = true, .EXECINSTR = true },
|
||||
.addralign = elf.mf.flags.block_size,
|
||||
}));
|
||||
assert(elf.si.data == try elf.addSection(elf.ni.data, .{
|
||||
assert(elf.si.data == try elf.addSection(if (@"type" != .REL) elf.ni.data else elf.ni.file, .{
|
||||
.name = ".data",
|
||||
.flags = .{ .WRITE = true, .ALLOC = true },
|
||||
.addralign = elf.mf.flags.block_size,
|
||||
@ -1064,6 +1072,7 @@ fn initHeaders(
|
||||
try elf.linkSections(elf.si.dynsym, elf.si.dynstr);
|
||||
}
|
||||
if (comp.config.any_non_single_threaded) {
|
||||
if (@"type" != .REL) {
|
||||
elf.ni.tls = try elf.mf.addLastChildNode(gpa, elf.ni.rodata, .{
|
||||
.alignment = elf.mf.flags.block_size,
|
||||
.moved = true,
|
||||
@ -1071,8 +1080,9 @@ fn initHeaders(
|
||||
});
|
||||
elf.nodes.appendAssumeCapacity(.{ .segment = tls_phndx });
|
||||
elf.phdrs.items[tls_phndx] = elf.ni.tls;
|
||||
}
|
||||
|
||||
elf.si.tdata = try elf.addSection(elf.ni.tls, .{
|
||||
elf.si.tdata = try elf.addSection(if (@"type" != .REL) elf.ni.tls else elf.ni.file, .{
|
||||
.name = ".tdata",
|
||||
.flags = .{ .WRITE = true, .ALLOC = true, .TLS = true },
|
||||
.addralign = elf.mf.flags.block_size,
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user