diff --git a/src/link.zig b/src/link.zig index 3f05f0772cd664f40360948b9e7f9d9a3f132ba0..1329d4eec7ef44f47c40754d0b451ac117a59e7a 100644 --- a/src/link.zig +++ b/src/link.zig @@ -67,7 +67,6 @@ pub const File = struct { gc_sections: bool, print_gc_sections: bool, build_id: std.zig.BuildId, - rpath_list: []const []const u8, allow_shlib_undefined: bool, stack_size: u64, diff --git a/src/link/C.zig b/src/link/C.zig index 7a5bf780b490dd52897ce614d65dc48cf544d22a..d2d4ca9fbcedd922f469b21a7dd5a8f1831b4550 100644 --- a/src/link/C.zig +++ b/src/link/C.zig @@ -148,7 +148,6 @@ pub fn createEmpty( .file = file, .disable_lld_caching = options.disable_lld_caching, .build_id = options.build_id, - .rpath_list = options.rpath_list, }, }; diff --git a/src/link/Coff.zig b/src/link/Coff.zig index 24040cb2f852817053f1a1dd9268e41efd6d0a65..b104cd58405f38de280b5e62e3df89eeac687468 100644 --- a/src/link/Coff.zig +++ b/src/link/Coff.zig @@ -263,7 +263,6 @@ pub fn createEmpty( .file = null, .disable_lld_caching = options.disable_lld_caching, .build_id = options.build_id, - .rpath_list = options.rpath_list, }, .ptr_width = ptr_width, .page_size = page_size, diff --git a/src/link/Elf.zig b/src/link/Elf.zig index f7b0529d8fce1c2beacfed45f999ab9f6bb54a57..2bb204811235901a1b6fbe8063c6f1d9f0e063aa 100644 --- a/src/link/Elf.zig +++ b/src/link/Elf.zig @@ -1,4 +1,5 @@ base: link.File, +rpath_table: std.StringArrayHashMapUnmanaged(void), image_base: u64, emit_relocs: bool, z_nodelete: bool, @@ -239,6 +240,11 @@ pub fn createEmpty( else try std.fmt.allocPrint(arena, "{s}.o", .{emit.sub_path}); + var rpath_table: std.StringArrayHashMapUnmanaged(void) = .empty; + try rpath_table.entries.resize(arena, options.rpath_list.len); + @memcpy(rpath_table.entries.items(.key), options.rpath_list); + try rpath_table.reIndex(arena); + const self = try arena.create(Elf); self.* = .{ .base = .{ @@ -253,8 +259,8 @@ pub fn createEmpty( .file = null, .disable_lld_caching = options.disable_lld_caching, .build_id = options.build_id, - .rpath_list = options.rpath_list, }, + .rpath_table = rpath_table, .ptr_width = ptr_width, .page_size = page_size, .default_sym_version = default_sym_version, @@ -829,14 +835,6 @@ pub fn flushModule(self: *Elf, arena: Allocator, tid: Zcu.PerThread.Id, prog_nod if (module_obj_path) |path| try positionals.append(.{ .path = path }); - // rpaths - var rpath_table = std.StringArrayHashMap(void).init(gpa); - defer rpath_table.deinit(); - - for (self.base.rpath_list) |rpath| { - _ = try rpath_table.put(rpath, {}); - } - if (comp.config.any_sanitize_thread) { try positionals.append(.{ .path = comp.tsan_lib.?.full_object_path }); } @@ -1056,7 +1054,7 @@ pub fn flushModule(self: *Elf, arena: Allocator, tid: Zcu.PerThread.Id, prog_nod try self.initSpecialPhdrs(); try self.sortShdrs(); - try self.setDynamicSection(rpath_table.keys()); + try self.setDynamicSection(self.rpath_table.keys()); self.sortDynamicSymtab(); try self.setHashSections(); try self.setVersionSymtab(); @@ -1207,9 +1205,8 @@ fn dumpArgv(self: *Elf, comp: *Compilation) !void { try argv.appendSlice(&.{ "--entry", name }); } - for (self.base.rpath_list) |rpath| { - try argv.append("-rpath"); - try argv.append(rpath); + for (self.rpath_table.keys()) |rpath| { + try argv.appendSlice(&.{ "-rpath", rpath }); } try argv.appendSlice(&.{ @@ -1978,7 +1975,7 @@ fn linkWithLLD(self: *Elf, arena: Allocator, tid: Zcu.PerThread.Id, prog_node: s man.hash.add(self.emit_relocs); man.hash.add(comp.config.rdynamic); man.hash.addListOfBytes(self.lib_dirs); - man.hash.addListOfBytes(self.base.rpath_list); + man.hash.addListOfBytes(self.rpath_table.keys()); if (output_mode == .Exe) { man.hash.add(self.base.stack_size); man.hash.add(self.base.build_id); @@ -2263,14 +2260,8 @@ fn linkWithLLD(self: *Elf, arena: Allocator, tid: Zcu.PerThread.Id, prog_node: s if (csu.crti) |v| try argv.append(v); if (csu.crtbegin) |v| try argv.append(v); - // rpaths - var rpath_table = std.StringHashMap(void).init(gpa); - defer rpath_table.deinit(); - for (self.base.rpath_list) |rpath| { - if ((try rpath_table.fetchPut(rpath, {})) == null) { - try argv.append("-rpath"); - try argv.append(rpath); - } + for (self.rpath_table.keys()) |rpath| { + try argv.appendSlice(&.{ "-rpath", rpath }); } for (self.symbol_wrap_set.keys()) |symbol_name| { diff --git a/src/link/MachO.zig b/src/link/MachO.zig index 9e2dbf6007e70734691505d13808010a79cd1738..d78d2f51481c8f249475a592cc42bfb17b448e6f 100644 --- a/src/link/MachO.zig +++ b/src/link/MachO.zig @@ -1,5 +1,7 @@ base: link.File, +rpath_list: []const []const u8, + /// If this is not null, an object file is created by LLVM and emitted to zcu_object_sub_path. llvm_object: ?LlvmObject.Ptr = null, @@ -192,8 +194,8 @@ pub fn createEmpty( .file = null, .disable_lld_caching = options.disable_lld_caching, .build_id = options.build_id, - .rpath_list = options.rpath_list, }, + .rpath_list = options.rpath_list, .pagezero_size = options.pagezero_size, .headerpad_size = options.headerpad_size, .headerpad_max_install_names = options.headerpad_max_install_names, @@ -662,9 +664,8 @@ fn dumpArgv(self: *MachO, comp: *Compilation) !void { try argv.append(syslibroot); } - for (self.base.rpath_list) |rpath| { - try argv.append("-rpath"); - try argv.append(rpath); + for (self.rpath_list) |rpath| { + try argv.appendSlice(&.{ "-rpath", rpath }); } if (self.pagezero_size) |size| { @@ -2842,7 +2843,7 @@ fn writeLoadCommands(self: *MachO) !struct { usize, usize, u64 } { ncmds += 1; } - for (self.base.rpath_list) |rpath| { + for (self.rpath_list) |rpath| { try load_commands.writeRpathLC(rpath, writer); ncmds += 1; } diff --git a/src/link/MachO/load_commands.zig b/src/link/MachO/load_commands.zig index a891bedbd6a243eddfff7226f05cfed94459b282..b90b0908647d8f9a6b07ea9e8832b632c090a58d 100644 --- a/src/link/MachO/load_commands.zig +++ b/src/link/MachO/load_commands.zig @@ -63,7 +63,7 @@ pub fn calcLoadCommandsSize(macho_file: *MachO, assume_max_path_len: bool) !u32 } // LC_RPATH { - for (macho_file.base.rpath_list) |rpath| { + for (macho_file.rpath_list) |rpath| { sizeofcmds += calcInstallNameLen( @sizeOf(macho.rpath_command), rpath, diff --git a/src/link/NvPtx.zig b/src/link/NvPtx.zig index 1488f65ff9575395c9f1d267c26cf068167a72b7..199b13a6c6d8e66536dbfa7d0bb113c04027c494 100644 --- a/src/link/NvPtx.zig +++ b/src/link/NvPtx.zig @@ -60,7 +60,6 @@ pub fn createEmpty( .file = null, .disable_lld_caching = options.disable_lld_caching, .build_id = options.build_id, - .rpath_list = options.rpath_list, }, .llvm_object = llvm_object, }; diff --git a/src/link/Plan9.zig b/src/link/Plan9.zig index 413ab7372ac9287f00fe9ca207e726b5e3b6b138..483f5406996e0244fe89d229494bb31430e34d0d 100644 --- a/src/link/Plan9.zig +++ b/src/link/Plan9.zig @@ -304,7 +304,6 @@ pub fn createEmpty( .file = null, .disable_lld_caching = options.disable_lld_caching, .build_id = options.build_id, - .rpath_list = options.rpath_list, }, .sixtyfour_bit = sixtyfour_bit, .bases = undefined, diff --git a/src/link/SpirV.zig b/src/link/SpirV.zig index 7263b6d28d75fefdff67c12007afd029643f0d95..bbc267cbc51d0e941c7c322e0a4f23f6e4529de6 100644 --- a/src/link/SpirV.zig +++ b/src/link/SpirV.zig @@ -74,7 +74,6 @@ pub fn createEmpty( .file = null, .disable_lld_caching = options.disable_lld_caching, .build_id = options.build_id, - .rpath_list = options.rpath_list, }, .object = codegen.Object.init(gpa), }; diff --git a/src/link/Wasm.zig b/src/link/Wasm.zig index 7d97fb4c7d8ed407ee3d4970fd1538d8e3d082bf..fed44b73319fee8d4498e02600068a7d7686bab4 100644 --- a/src/link/Wasm.zig +++ b/src/link/Wasm.zig @@ -398,7 +398,6 @@ pub fn createEmpty( .file = null, .disable_lld_caching = options.disable_lld_caching, .build_id = options.build_id, - .rpath_list = options.rpath_list, }, .name = undefined, .import_table = options.import_table,