aboutsummaryrefslogtreecommitdiff
path: root/src/link
diff options
context:
space:
mode:
authorJakub Konka <kubkon@jakubkonka.com>2024-09-24 10:56:48 +0200
committerJakub Konka <kubkon@jakubkonka.com>2024-09-25 17:54:50 +0200
commitdb3db1150e48cf506593489dff93adda9e1111fe (patch)
treed528b81913591daf74bd7630982afe67d665a5f6 /src/link
parent62c282ba4699bd00d0cb74b3253bac7a925eae68 (diff)
downloadzig-db3db1150e48cf506593489dff93adda9e1111fe.tar.gz
zig-db3db1150e48cf506593489dff93adda9e1111fe.zip
elf: do not re-create special program headers if already created
Diffstat (limited to 'src/link')
-rw-r--r--src/link/Elf.zig22
1 files changed, 12 insertions, 10 deletions
diff --git a/src/link/Elf.zig b/src/link/Elf.zig
index 8e09c7832d..1ffde07b7a 100644
--- a/src/link/Elf.zig
+++ b/src/link/Elf.zig
@@ -3159,36 +3159,38 @@ pub fn initShStrtab(self: *Elf) !void {
fn initSpecialPhdrs(self: *Elf) !void {
comptime assert(max_number_of_special_phdrs == 5);
- if (self.interp_section_index != null) {
+ if (self.interp_section_index != null and self.phdr_interp_index == null) {
self.phdr_interp_index = try self.addPhdr(.{
.type = elf.PT_INTERP,
.flags = elf.PF_R,
.@"align" = 1,
});
}
- if (self.dynamic_section_index != null) {
+ if (self.dynamic_section_index != null and self.phdr_dynamic_index == null) {
self.phdr_dynamic_index = try self.addPhdr(.{
.type = elf.PT_DYNAMIC,
.flags = elf.PF_R | elf.PF_W,
});
}
- if (self.eh_frame_hdr_section_index != null) {
+ if (self.eh_frame_hdr_section_index != null and self.phdr_gnu_eh_frame_index == null) {
self.phdr_gnu_eh_frame_index = try self.addPhdr(.{
.type = elf.PT_GNU_EH_FRAME,
.flags = elf.PF_R,
});
}
- self.phdr_gnu_stack_index = try self.addPhdr(.{
- .type = elf.PT_GNU_STACK,
- .flags = elf.PF_W | elf.PF_R,
- .memsz = self.base.stack_size,
- .@"align" = 1,
- });
+ if (self.phdr_gnu_stack_index == null) {
+ self.phdr_gnu_stack_index = try self.addPhdr(.{
+ .type = elf.PT_GNU_STACK,
+ .flags = elf.PF_W | elf.PF_R,
+ .memsz = self.base.stack_size,
+ .@"align" = 1,
+ });
+ }
const has_tls = for (self.sections.items(.shdr)) |shdr| {
if (shdr.sh_flags & elf.SHF_TLS != 0) break true;
} else false;
- if (has_tls) {
+ if (has_tls and self.phdr_tls_index == null) {
self.phdr_tls_index = try self.addPhdr(.{
.type = elf.PT_TLS,
.flags = elf.PF_R,