Browse Source

Merge pull request #4976 from voutilad/openbsd-linker

Fix linking of programs on OpenBSD
gingerBill 4 months ago
parent
commit
71db9ac1ba
3 changed files with 9 additions and 2 deletions
  1. 1 1
      base/runtime/os_specific_bsd.odin
  2. 1 1
      core/os/os_openbsd.odin
  3. 7 0
      src/linker.cpp

+ 1 - 1
base/runtime/os_specific_bsd.odin

@@ -9,7 +9,7 @@ foreign libc {
 	@(link_name="write")
 	_unix_write :: proc(fd: i32, buf: rawptr, size: int) -> int ---
 
-	when ODIN_OS == .NetBSD {
+	when ODIN_OS == .NetBSD || ODIN_OS == .OpenBSD {
 		@(link_name="__errno") __error :: proc() -> ^i32 ---
 	} else {
 		__error :: proc() -> ^i32 ---

+ 1 - 1
core/os/os_openbsd.odin

@@ -343,7 +343,7 @@ AT_REMOVEDIR        :: 0x08
 
 @(default_calling_convention="c")
 foreign libc {
-	@(link_name="__error")        __error              :: proc() -> ^c.int ---
+	@(link_name="__errno")        __error              :: proc() -> ^c.int ---
 
 	@(link_name="fork")           _unix_fork           :: proc() -> pid_t ---
 	@(link_name="getthrid")       _unix_getthrid       :: proc() -> int ---

+ 7 - 0
src/linker.cpp

@@ -701,6 +701,13 @@ gb_internal i32 linker_stage(LinkerData *gen) {
 					// This points the linker to where the entry point is
 					link_settings = gb_string_appendc(link_settings, "-e _main ");
 				}
+			} else if (build_context.metrics.os == TargetOs_openbsd) {
+				// OpenBSD ports install shared libraries in /usr/local/lib. Also, we must explicitly link libpthread.
+				platform_lib_str = gb_string_appendc(platform_lib_str, "-lpthread -Wl,-L/usr/local/lib ");
+				// Until the LLVM back-end can be adapted to emit endbr64 instructions on amd64, we
+				// need to pass -z nobtcfi in order to allow the resulting program to run under
+				// OpenBSD 7.4 and newer. Once support is added at compile time, this can be dropped.
+				platform_lib_str = gb_string_appendc(platform_lib_str, "-Wl,-z,nobtcfi ");
 			}
 
 			if (!build_context.no_rpath) {