From d3c3b672eae964ad9693e5ba9bef9316edf27e88 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Thu, 15 May 2025 17:21:46 -0700 Subject: [PATCH] image name helper --- src/linker/lnk_config.c | 16 ++++++++++++++-- src/linker/lnk_config.h | 1 + 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/linker/lnk_config.c b/src/linker/lnk_config.c index 632147b9..89c96599 100644 --- a/src/linker/lnk_config.c +++ b/src/linker/lnk_config.c @@ -364,6 +364,15 @@ lnk_error_invalid_uac_ui_access_param(LNK_ErrorCode error_code, String8 obj_path //////////////////////////////// +internal String8 +lnk_get_image_name(LNK_Config *config) +{ + String8 image_name = config->image_name; + image_name = str8_skip_last_slash(image_name); + image_name = str8_chop_last_dot(image_name); + return image_name; +} + internal U64 lnk_get_default_function_pad_min(COFF_MachineType machine) { @@ -835,8 +844,9 @@ lnk_parse_export_directive_ex(Arena *arena, String8List directive, String8 obj_p } // does directive have ordinal? - U16 ordinal16 = 0; - String8 ordinal = {0}; + COFF_ImportByType import_by = COFF_ImportBy_Name; + U16 ordinal16 = 0; + String8 ordinal = {0}; String8 noname_flag = {0}; if (str8_match(str8_prefix(str8_list_first(&flags), 1), str8_lit("@"), 0)) { // parse ordinal @@ -845,6 +855,7 @@ lnk_parse_export_directive_ex(Arena *arena, String8List directive, String8 obj_p U64 ordinal64 = u64_from_str8(ordinal, 10); if (ordinal64 <= max_U16) { ordinal16 = (U16)ordinal64; + import_by = COFF_ImportBy_Ordinal; } else { String8 d = str8_list_join(scratch.arena, &directive, &(StringJoin){.sep=str8_lit(",")}); lnk_error_with_loc(LNK_Error_IllExport, obj_path, lib_path, "ordinal value must fit into 16-bit integer, \"/EXPORT:%S\"", d); @@ -892,6 +903,7 @@ lnk_parse_export_directive_ex(Arena *arena, String8List directive, String8 obj_p export_out->name = push_str8_copy(arena, name); export_out->alias = push_str8_copy(arena, alias); export_out->type = type; + export_out->import_by = import_by; export_out->ordinal = ordinal16; export_out->is_ordinal_assigned = ordinal.size > 0; export_out->is_noname_present = noname_flag.size > 0; diff --git a/src/linker/lnk_config.h b/src/linker/lnk_config.h index d139cf2d..377740db 100644 --- a/src/linker/lnk_config.h +++ b/src/linker/lnk_config.h @@ -529,6 +529,7 @@ internal void lnk_error_cmd_switch_invalid_param (LNK_ErrorCode code, Strin //////////////////////////////// // Getters +internal String8 lnk_get_image_name(LNK_Config *config); internal U64 lnk_get_default_function_pad_min(COFF_MachineType machine); internal U64 lnk_get_base_addr(LNK_Config *config); internal Version lnk_get_default_subsystem_version(PE_WindowsSubsystem subsystem, COFF_MachineType machine);