diff options
| author | 0dminnimda <0dminnimda@gmail.com> | 2024-11-04 02:17:21 +0300 |
|---|---|---|
| committer | 0dminnimda <0dminnimda@gmail.com> | 2024-11-04 02:35:49 +0300 |
| commit | 35f1b0f11ebb97910f3b4c82abd4a87dd52985f9 (patch) | |
| tree | dc5dbd3c58035dd50aab1f98f579b38858747d68 /src | |
| parent | 5f99d6b42723edd1ed3aa145e5b7c6d56960e33e (diff) | |
Add support for linking as pie
Diffstat (limited to 'src')
| -rw-r--r-- | src/build_settings.cpp | 9 | ||||
| -rw-r--r-- | src/linker.cpp | 24 | ||||
| -rw-r--r-- | src/main.cpp | 21 |
3 files changed, 51 insertions, 3 deletions
diff --git a/src/build_settings.cpp b/src/build_settings.cpp index e365d0324..c37f24f12 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -257,6 +257,12 @@ enum RelocMode : u8 { RelocMode_DynamicNoPIC, }; +enum LinkPIE : u8 { + LinkPIE_Default, + LinkPIE_No, + LinkPIE_Yes, +}; + enum BuildPath : u8 { BuildPath_Main_Package, // Input Path to the package directory (or file) we're building. BuildPath_RC, // Input Path for .rc file, can be set with `-resource:`. @@ -453,7 +459,7 @@ struct BuildContext { bool no_threaded_checker; bool show_debug_messages; - + bool copy_file_contents; bool no_rtti; @@ -467,6 +473,7 @@ struct BuildContext { bool print_linker_flags; RelocMode reloc_mode; + LinkPIE link_pie; bool disable_red_zone; isize max_error_count; diff --git a/src/linker.cpp b/src/linker.cpp index 2ed0987ac..6b16c6489 100644 --- a/src/linker.cpp +++ b/src/linker.cpp @@ -605,9 +605,29 @@ gb_internal i32 linker_stage(LinkerData *gen) { link_settings = gb_string_appendc(link_settings, "-Wl,-fini,'_odin_exit_point' "); } - } else if (build_context.metrics.os != TargetOs_openbsd && build_context.metrics.os != TargetOs_haiku && build_context.metrics.arch != TargetArch_riscv64) { - // OpenBSD and Haiku default to PIE executable. do not pass -no-pie for it. + } + + switch (build_context.link_pie) { + case (LinkPIE_Default): + if (build_context.build_mode != BuildMode_DynamicLibrary) { + if (build_context.metrics.os != TargetOs_openbsd + && build_context.metrics.os != TargetOs_haiku + && build_context.metrics.arch != TargetArch_riscv64 + ) { + // OpenBSD and Haiku default to PIE executable. do not pass -no-pie for it. + link_settings = gb_string_appendc(link_settings, "-no-pie "); + } + } + break; + case (LinkPIE_Yes): + if (build_context.build_mode != BuildMode_Executable) { + compiler_error("linking NON-EXECUTABLE as pie (position independent EXECUTABLE)"); + } + link_settings = gb_string_appendc(link_settings, "-pie "); + break; + case (LinkPIE_No): link_settings = gb_string_appendc(link_settings, "-no-pie "); + break; } gbString platform_lib_str = gb_string_make(heap_allocator(), ""); diff --git a/src/main.cpp b/src/main.cpp index 1574ac544..5d017d51a 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -360,6 +360,7 @@ enum BuildFlagKind { BuildFlag_NoThreadLocal, BuildFlag_RelocMode, + BuildFlag_LinkPIE, BuildFlag_DisableRedZone, BuildFlag_DisallowDo, @@ -570,6 +571,7 @@ gb_internal bool parse_build_flags(Array<String> args) { add_flag(&build_flags, BuildFlag_MinimumOSVersion, str_lit("minimum-os-version"), BuildFlagParam_String, Command__does_build); add_flag(&build_flags, BuildFlag_RelocMode, str_lit("reloc-mode"), BuildFlagParam_String, Command__does_build); + add_flag(&build_flags, BuildFlag_LinkPIE, str_lit("link-pie"), BuildFlagParam_String, Command__does_build); add_flag(&build_flags, BuildFlag_DisableRedZone, str_lit("disable-red-zone"), BuildFlagParam_None, Command__does_build); add_flag(&build_flags, BuildFlag_DisallowDo, str_lit("disallow-do"), BuildFlagParam_None, Command__does_check); @@ -1332,6 +1334,25 @@ gb_internal bool parse_build_flags(Array<String> args) { break; } + case BuildFlag_LinkPIE: { + GB_ASSERT(value.kind == ExactValue_String); + String v = value.value_string; + if (v == "default") { + build_context.link_pie = LinkPIE_Default; + } else if (v == "yes" || v == "true") { + build_context.link_pie = LinkPIE_Yes; + } else if (v == "no" || v == "false") { + build_context.link_pie = LinkPIE_No; + } else { + gb_printf_err("-link-pie flag expected one of the following\n"); + gb_printf_err("\tdefault\n"); + gb_printf_err("\tyes, true\n"); + gb_printf_err("\tno, false\n"); + bad_flags = true; + } + + break; + } case BuildFlag_DisableRedZone: build_context.disable_red_zone = true; break; |