Commit e3409c0bce
Changed files (1)
src
link
src/link/Elf.zig
@@ -224,7 +224,7 @@ pub const HashStyle = enum { sysv, gnu, both };
pub const CompressDebugSections = enum { none, zlib, zstd };
pub const SortSection = enum { name, alignment };
-pub fn open(
+pub fn createEmpty(
arena: Allocator,
comp: *Compilation,
emit: Compilation.Emit,
@@ -238,8 +238,79 @@ pub fn open(
const opt_zcu = comp.module;
const output_mode = comp.config.output_mode;
const link_mode = comp.config.link_mode;
+ const optimize_mode = comp.root_mod.optimize_mode;
+ const is_native_os = comp.root_mod.resolved_target.is_native_os;
+ const ptr_width: PtrWidth = switch (target.ptrBitWidth()) {
+ 0...32 => .p32,
+ 33...64 => .p64,
+ else => return error.UnsupportedELFArchitecture,
+ };
+
+ const page_size: u32 = switch (target.cpu.arch) {
+ .powerpc64le => 0x10000,
+ .sparc64 => 0x2000,
+ else => 0x1000,
+ };
+ const is_dyn_lib = output_mode == .Lib and link_mode == .Dynamic;
+ const default_sym_version: elf.Elf64_Versym = if (is_dyn_lib or comp.config.rdynamic)
+ elf.VER_NDX_GLOBAL
+ else
+ elf.VER_NDX_LOCAL;
+
+ const self = try arena.create(Elf);
+ self.* = .{
+ .base = .{
+ .tag = .elf,
+ .comp = comp,
+ .emit = emit,
+ .gc_sections = options.gc_sections orelse (optimize_mode != .Debug and output_mode != .Obj),
+ .print_gc_sections = options.print_gc_sections,
+ .stack_size = options.stack_size orelse 16777216,
+ .allow_shlib_undefined = options.allow_shlib_undefined orelse !is_native_os,
+ .file = null,
+ .disable_lld_caching = options.disable_lld_caching,
+ .build_id = options.build_id,
+ .rpath_list = options.rpath_list,
+ .force_undefined_symbols = options.force_undefined_symbols,
+ },
+ .ptr_width = ptr_width,
+ .page_size = page_size,
+ .default_sym_version = default_sym_version,
+
+ .image_base = b: {
+ if (is_dyn_lib) break :b 0;
+ if (output_mode == .Exe and comp.config.pie) break :b 0;
+ break :b options.image_base orelse switch (ptr_width) {
+ .p32 => 0x1000,
+ .p64 => 0x1000000,
+ };
+ },
- const self = try createEmpty(arena, comp, emit, options);
+ .eh_frame_hdr = options.eh_frame_hdr,
+ .emit_relocs = options.emit_relocs,
+ .z_nodelete = options.z_nodelete,
+ .z_notext = options.z_notext,
+ .z_defs = options.z_defs,
+ .z_origin = options.z_origin,
+ .z_nocopyreloc = options.z_nocopyreloc,
+ .z_now = options.z_now,
+ .z_relro = options.z_relro,
+ .z_common_page_size = options.z_common_page_size,
+ .z_max_page_size = options.z_max_page_size,
+ .lib_dirs = options.lib_dirs,
+ .hash_style = options.hash_style,
+ .compress_debug_sections = options.compress_debug_sections,
+ .symbol_wrap_set = options.symbol_wrap_set,
+ .each_lib_rpath = options.each_lib_rpath,
+ .sort_section = options.sort_section,
+ .soname = options.soname,
+ .bind_global_refs_locally = options.bind_global_refs_locally,
+ .linker_script = options.linker_script,
+ .version_script = options.version_script,
+ };
+ if (use_llvm and comp.config.have_zcu) {
+ self.llvm_object = try LlvmObject.create(arena, comp);
+ }
errdefer self.base.destroy();
if (use_lld and use_llvm) {
@@ -343,91 +414,13 @@ pub fn open(
return self;
}
-pub fn createEmpty(
+pub fn open(
arena: Allocator,
comp: *Compilation,
emit: Compilation.Emit,
options: link.File.OpenOptions,
) !*Elf {
- const use_llvm = comp.config.use_llvm;
- const optimize_mode = comp.root_mod.optimize_mode;
- const target = comp.root_mod.resolved_target.result;
- const output_mode = comp.config.output_mode;
- const link_mode = comp.config.link_mode;
- const is_native_os = comp.root_mod.resolved_target.is_native_os;
- const ptr_width: PtrWidth = switch (target.ptrBitWidth()) {
- 0...32 => .p32,
- 33...64 => .p64,
- else => return error.UnsupportedELFArchitecture,
- };
- const self = try arena.create(Elf);
-
- const page_size: u32 = switch (target.cpu.arch) {
- .powerpc64le => 0x10000,
- .sparc64 => 0x2000,
- else => 0x1000,
- };
- const is_dyn_lib = output_mode == .Lib and link_mode == .Dynamic;
- const default_sym_version: elf.Elf64_Versym = if (is_dyn_lib or comp.config.rdynamic)
- elf.VER_NDX_GLOBAL
- else
- elf.VER_NDX_LOCAL;
-
- self.* = .{
- .base = .{
- .tag = .elf,
- .comp = comp,
- .emit = emit,
- .gc_sections = options.gc_sections orelse (optimize_mode != .Debug and output_mode != .Obj),
- .print_gc_sections = options.print_gc_sections,
- .stack_size = options.stack_size orelse 16777216,
- .allow_shlib_undefined = options.allow_shlib_undefined orelse !is_native_os,
- .file = null,
- .disable_lld_caching = options.disable_lld_caching,
- .build_id = options.build_id,
- .rpath_list = options.rpath_list,
- .force_undefined_symbols = options.force_undefined_symbols,
- },
- .ptr_width = ptr_width,
- .page_size = page_size,
- .default_sym_version = default_sym_version,
-
- .image_base = b: {
- if (is_dyn_lib) break :b 0;
- if (output_mode == .Exe and comp.config.pie) break :b 0;
- break :b options.image_base orelse switch (ptr_width) {
- .p32 => 0x1000,
- .p64 => 0x1000000,
- };
- },
-
- .eh_frame_hdr = options.eh_frame_hdr,
- .emit_relocs = options.emit_relocs,
- .z_nodelete = options.z_nodelete,
- .z_notext = options.z_notext,
- .z_defs = options.z_defs,
- .z_origin = options.z_origin,
- .z_nocopyreloc = options.z_nocopyreloc,
- .z_now = options.z_now,
- .z_relro = options.z_relro,
- .z_common_page_size = options.z_common_page_size,
- .z_max_page_size = options.z_max_page_size,
- .lib_dirs = options.lib_dirs,
- .hash_style = options.hash_style,
- .compress_debug_sections = options.compress_debug_sections,
- .symbol_wrap_set = options.symbol_wrap_set,
- .each_lib_rpath = options.each_lib_rpath,
- .sort_section = options.sort_section,
- .soname = options.soname,
- .bind_global_refs_locally = options.bind_global_refs_locally,
- .linker_script = options.linker_script,
- .version_script = options.version_script,
- };
- if (use_llvm and comp.config.have_zcu) {
- self.llvm_object = try LlvmObject.create(arena, comp);
- }
-
- return self;
+ return createEmpty(arena, comp, emit, options);
}
pub fn deinit(self: *Elf) void {