From 30a1dc84498b6de491aecb1ee1bada16d0731564 Mon Sep 17 00:00:00 2001 From: Emery Hemingway Date: Sat, 15 Feb 2020 12:47:47 +0100 Subject: [PATCH 1/7] Replace 'cstderr.rawWrite' with 'writeToStdErr' Use a procedure that is easy to replace on platforms without UNIX file descriptors. --- lib/system.nim | 10 +++++----- lib/system/arc.nim | 10 +++++----- lib/system/dyncalls.nim | 34 +++++++++++++++++----------------- lib/system/excpt.nim | 7 ++++++- lib/system/fatal.nim | 4 ++-- lib/system/gc.nim | 8 ++++---- lib/system/gc_common.nim | 4 ++-- lib/system/gc_hooks.nim | 4 ++-- lib/system/gc_ms.nim | 4 ++-- lib/system/mmdisp.nim | 2 +- lib/system/orc.nim | 12 ++++++------ 11 files changed, 52 insertions(+), 47 deletions(-) diff --git a/lib/system.nim b/lib/system.nim index 2b66d637f..9fb5e5ac5 100644 --- a/lib/system.nim +++ b/lib/system.nim @@ -1194,9 +1194,9 @@ else: template sysAssert(cond: bool, msg: string) = when defined(useSysAssert): if not cond: - cstderr.rawWrite "[SYSASSERT] " - cstderr.rawWrite msg - cstderr.rawWrite "\n" + writeToStdErr "[SYSASSERT] " + writeToStdErr msg + writeToStdErr "\n" quit 1 const hasAlloc = (hostOS != "standalone" or not defined(nogc)) and not defined(nimscript) @@ -2414,8 +2414,8 @@ proc quit*(errormsg: string, errorcode = QuitFailure) {.noreturn.} = when nimvm: echo errormsg else: - cstderr.rawWrite(errormsg) - cstderr.rawWrite("\n") + writeToStdErr(errormsg) + writeToStdErr("\n") quit(errorcode) {.pop.} # checks: off diff --git a/lib/system/arc.nim b/lib/system/arc.nim index 4c97f1aa0..0087d286c 100644 --- a/lib/system/arc.nim +++ b/lib/system/arc.nim @@ -150,7 +150,7 @@ proc nimRawDispose(p: pointer, alignment: int) {.compilerRtl.} = cprintf("[Freed] %p\n", p -! sizeof(RefHeader)) when defined(nimOwnedEnabled): if head(p).rc >= rcIncrement: - cstderr.rawWrite "[FATAL] dangling references exist\n" + writeToStdErr "[FATAL] dangling references exist\n" quit 1 when defined(nimArcDebug): # we do NOT really free the memory here in order to reliably detect use-after-frees @@ -168,12 +168,12 @@ proc nimDestroyAndDispose(p: pointer) {.compilerRtl, raises: [].} = if rti.destructor != nil: cast[DestructorProc](rti.destructor)(p) when false: - cstderr.rawWrite cast[ptr PNimTypeV2](p)[].name - cstderr.rawWrite "\n" + writeToStdErr cast[ptr PNimTypeV2](p)[].name + writeToStdErr "\n" if d == nil: - cstderr.rawWrite "bah, nil\n" + writeToStdErr "bah, nil\n" else: - cstderr.rawWrite "has destructor!\n" + writeToStdErr "has destructor!\n" nimRawDispose(p, rti.align) when defined(gcOrc): diff --git a/lib/system/dyncalls.nim b/lib/system/dyncalls.nim index 1b0a3e64c..9a0cb3347 100644 --- a/lib/system/dyncalls.nim +++ b/lib/system/dyncalls.nim @@ -20,15 +20,15 @@ const proc nimLoadLibraryError(path: string) = # carefully written to avoid memory allocation: const prefix = "could not load: " - cstderr.rawWrite(prefix) - cstderr.rawWrite(path) + writeToStdErr(prefix) + writeToStdErr(path) when not defined(nimDebugDlOpen) and not defined(windows): - cstderr.rawWrite("\n(compile with -d:nimDebugDlOpen for more information)") + writeToStdErr("\n(compile with -d:nimDebugDlOpen for more information)") when defined(windows): const badExe = "\n(bad format; library may be wrong architecture)" let loadError = GetLastError() if loadError == ERROR_BAD_EXE_FORMAT: - cstderr.rawWrite(badExe) + writeToStdErr(badExe) when defined(guiapp): # Because console output is not shown in GUI apps, display the error as a # message box instead: @@ -46,14 +46,14 @@ proc nimLoadLibraryError(path: string) = if loadError == ERROR_BAD_EXE_FORMAT and msgLeft >= badExe.len: copyMem(msg[msgIdx].addr, badExe.cstring, badExe.len) discard MessageBoxA(nil, msg[0].addr, nil, 0) - cstderr.rawWrite("\n") + writeToStdErr("\n") quit(1) proc procAddrError(name: cstring) {.compilerproc, nonReloadable, hcrInline.} = # carefully written to avoid memory allocation: - cstderr.rawWrite("could not import: ") - cstderr.rawWrite(name) - cstderr.rawWrite("\n") + writeToStdErr("could not import: ") + writeToStdErr(name) + writeToStdErr("\n") quit(1) # this code was inspired from Lua's source code: @@ -98,8 +98,8 @@ when defined(posix): when defined(nimDebugDlOpen): let error = dlerror() if error != nil: - cstderr.rawWrite(error) - cstderr.rawWrite("\n") + writeToStdErr(error) + writeToStdErr("\n") proc nimGetProcAddr(lib: LibHandle, name: cstring): ProcAddr = result = dlsym(lib, name) @@ -181,20 +181,20 @@ elif defined(genode): elif defined(nintendoswitch) or defined(freertos): proc nimUnloadLibrary(lib: LibHandle) = - cstderr.rawWrite("nimUnLoadLibrary not implemented") - cstderr.rawWrite("\n") + writeToStdErr("nimUnLoadLibrary not implemented") + writeToStdErr("\n") quit(1) proc nimLoadLibrary(path: string): LibHandle = - cstderr.rawWrite("nimLoadLibrary not implemented") - cstderr.rawWrite("\n") + writeToStdErr("nimLoadLibrary not implemented") + writeToStdErr("\n") quit(1) proc nimGetProcAddr(lib: LibHandle, name: cstring): ProcAddr = - cstderr.rawWrite("nimGetProAddr not implemented") - cstderr.rawWrite(name) - cstderr.rawWrite("\n") + writeToStdErr("nimGetProAddr not implemented") + writeToStdErr(name) + writeToStdErr("\n") quit(1) else: diff --git a/lib/system/excpt.nim b/lib/system/excpt.nim index 1a7473a76..8ac4dcb9f 100644 --- a/lib/system/excpt.nim +++ b/lib/system/excpt.nim @@ -24,8 +24,13 @@ when defined(windows): proc GetLastError(): int32 {.header: "", nodecl.} const ERROR_BAD_EXE_FORMAT = 193 -when not defined(windows) or not defined(guiapp): +elif defined(genode): + proc writeToStdErr(msg: cstring) = + {.emit: "Genode::error(Genode::Cstring(`msg`));".} + +elif not defined(guiapp): proc writeToStdErr(msg: cstring) = rawWrite(cstderr, msg) + else: proc MessageBoxA(hWnd: pointer, lpText, lpCaption: cstring, uType: int): int32 {. header: "", nodecl.} diff --git a/lib/system/fatal.nim b/lib/system/fatal.nim index 761e0dd69..791361380 100644 --- a/lib/system/fatal.nim +++ b/lib/system/fatal.nim @@ -37,8 +37,8 @@ elif (defined(nimQuirky) or defined(nimPanics)) and not defined(nimscript): add(buf, arg) add(buf, " [") add(buf, name exceptn) - add(buf, "]\n") - cstderr.rawWrite buf + add(buf, "]") + writeToStdErr buf quit 1 proc sysFatal(exceptn: typedesc, message: string) {.inline, noreturn.} = diff --git a/lib/system/gc.nim b/lib/system/gc.nim index 1f7164266..c81ce1b12 100644 --- a/lib/system/gc.nim +++ b/lib/system/gc.nim @@ -105,11 +105,11 @@ when not defined(useNimRtl): template gcAssert(cond: bool, msg: string) = when defined(useGcAssert): if not cond: - cstderr.rawWrite "[GCASSERT] " - cstderr.rawWrite msg + writeToStdErr "[GCASSERT] " + writeToStdErr msg when defined(logGC): - cstderr.rawWrite "[GCASSERT] statistics:\L" - cstderr.rawWrite GC_getStatistics() + writeToStdErr "[GCASSERT] statistics:\L" + writeToStdErr GC_getStatistics() GC_disable() writeStackTrace() #var x: ptr int diff --git a/lib/system/gc_common.nim b/lib/system/gc_common.nim index 658c5d025..60d4f785e 100644 --- a/lib/system/gc_common.nim +++ b/lib/system/gc_common.nim @@ -471,7 +471,7 @@ proc nimRegisterGlobalMarker(markerProc: GlobalMarkerProc) {.compilerproc.} = globalMarkers[globalMarkersLen] = markerProc inc globalMarkersLen else: - cstderr.rawWrite("[GC] cannot register global variable; too many global variables") + writeToStdErr("[GC] cannot register global variable; too many global variables") quit 1 proc nimRegisterThreadLocalMarker(markerProc: GlobalMarkerProc) {.compilerproc.} = @@ -479,5 +479,5 @@ proc nimRegisterThreadLocalMarker(markerProc: GlobalMarkerProc) {.compilerproc.} threadLocalMarkers[threadLocalMarkersLen] = markerProc inc threadLocalMarkersLen else: - cstderr.rawWrite("[GC] cannot register thread local variable; too many thread local variables") + writeToStdErr("[GC] cannot register thread local variable; too many thread local variables") quit 1 diff --git a/lib/system/gc_hooks.nim b/lib/system/gc_hooks.nim index 70f02e657..a55359b61 100644 --- a/lib/system/gc_hooks.nim +++ b/lib/system/gc_hooks.nim @@ -23,7 +23,7 @@ proc nimRegisterGlobalMarker(markerProc: GlobalMarkerProc) {.compilerproc.} = globalMarkers[globalMarkersLen] = markerProc inc globalMarkersLen else: - cstderr.rawWrite("[GC] cannot register global variable; too many global variables") + writeToStdErr("[GC] cannot register global variable; too many global variables") quit 1 proc nimRegisterThreadLocalMarker(markerProc: GlobalMarkerProc) {.compilerproc.} = @@ -31,7 +31,7 @@ proc nimRegisterThreadLocalMarker(markerProc: GlobalMarkerProc) {.compilerproc.} threadLocalMarkers[threadLocalMarkersLen] = markerProc inc threadLocalMarkersLen else: - cstderr.rawWrite("[GC] cannot register thread local variable; too many thread local variables") + writeToStdErr("[GC] cannot register thread local variable; too many thread local variables") quit 1 proc traverseGlobals*() = diff --git a/lib/system/gc_ms.nim b/lib/system/gc_ms.nim index 852f5d7aa..c25ab499f 100644 --- a/lib/system/gc_ms.nim +++ b/lib/system/gc_ms.nim @@ -88,8 +88,8 @@ when not defined(useNimRtl): template gcAssert(cond: bool, msg: string) = when defined(useGcAssert): if not cond: - cstderr.rawWrite "[GCASSERT] " - cstderr.rawWrite msg + writeToStdErr "[GCASSERT] " + writeToStdErr msg quit 1 proc cellToUsr(cell: PCell): pointer {.inline.} = diff --git a/lib/system/mmdisp.nim b/lib/system/mmdisp.nim index 5fe1960d1..beca06472 100644 --- a/lib/system/mmdisp.nim +++ b/lib/system/mmdisp.nim @@ -45,7 +45,7 @@ else: proc raiseOutOfMem() {.noinline.} = if outOfMemHook != nil: outOfMemHook() - cstderr.rawWrite("out of memory\n") + writeToStdErr("out of memory") quit(1) when defined(boehmgc): diff --git a/lib/system/orc.nim b/lib/system/orc.nim index 28f8e5808..49fc43ad4 100644 --- a/lib/system/orc.nim +++ b/lib/system/orc.nim @@ -77,16 +77,16 @@ proc free(s: Cell; desc: PNimTypeV2) {.inline.} = cast[DisposeProc](desc.disposeImpl)(p) when false: - cstderr.rawWrite desc.name - cstderr.rawWrite " " + writeToStdErr desc.name + writeToStdErr " " if desc.disposeImpl == nil: - cstderr.rawWrite "lacks dispose" + writeToStdErr "lacks dispose" if desc.traceImpl != nil: - cstderr.rawWrite ", but has trace\n" + writeToStdErr ", but has trace\n" else: - cstderr.rawWrite ", and lacks trace\n" + writeToStdErr ", and lacks trace\n" else: - cstderr.rawWrite "has dispose!\n" + writeToStdErr "has dispose!\n" nimRawDispose(p, desc.align) -- 2.29.2 From 5e768437f34cc8965246f9ec996a285a0466c525 Mon Sep 17 00:00:00 2001 From: Emery Hemingway Date: Sat, 8 Feb 2020 14:32:18 +0100 Subject: [PATCH 2/7] Genode: move dyncall failures to runtime Do not use the "error" pragma to warn that dynamic library loading is not implemented, print a message at runtime and exit. --- lib/pure/dynlib.nim | 26 ++++++++++++++++++++++++++ lib/system/dyncalls.nim | 15 +++++++++------ 2 files changed, 35 insertions(+), 6 deletions(-) diff --git a/lib/pure/dynlib.nim b/lib/pure/dynlib.nim index 42d13535f..d8934b0f0 100644 --- a/lib/pure/dynlib.nim +++ b/lib/pure/dynlib.nim @@ -150,6 +150,32 @@ elif defined(nintendoswitch): proc symAddr(lib: LibHandle, name: cstring): pointer = raise newException(OSError, "symAddr not implemented on Nintendo Switch!") +elif defined(genode): + # + # ========================================================================= + # Not implemented for Genode without POSIX. Raise an error if called. + # ========================================================================= + # + + template raiseErr(prc: string) = + raise newException(OSError, prc & " not implemented, compile with POSIX suport") + + proc dlclose(lib: LibHandle) = + raiseErr(OSError, "dlclose") + proc dlopen(path: cstring, mode: int): LibHandle = + raiseErr(OSError, "dlopen") + proc dlsym(lib: LibHandle, name: cstring): pointer = + raiseErr(OSError, "dlsym") + proc loadLib(path: string, global_symbols = false): LibHandle = + raiseErr(OSError, "loadLib") + proc loadLib(): LibHandle = + raiseErr(OSError, "loadLib") + proc unloadLib(lib: LibHandle) = + raiseErr(OSError, "unloadLib") + proc symAddr(lib: LibHandle, name: cstring): pointer = + raiseErr(OSError, "symAddr") + + elif defined(windows) or defined(dos): # # ======================================================================= diff --git a/lib/system/dyncalls.nim b/lib/system/dyncalls.nim index 9a0cb3347..3df0e3af0 100644 --- a/lib/system/dyncalls.nim +++ b/lib/system/dyncalls.nim @@ -170,14 +170,17 @@ elif defined(windows) or defined(dos): elif defined(genode): - proc nimUnloadLibrary(lib: LibHandle) {. - error: "nimUnloadLibrary not implemented".} + proc nimUnloadLibrary(lib: LibHandle) = + writeToStdErr("nimUnloadLibrary not implemented") + quit(1) - proc nimLoadLibrary(path: string): LibHandle {. - error: "nimLoadLibrary not implemented".} + proc nimLoadLibrary(path: string): LibHandle = + writeToStdErr("nimLoadLibrary not implemented") + quit(1) - proc nimGetProcAddr(lib: LibHandle, name: cstring): ProcAddr {. - error: "nimGetProcAddr not implemented".} + proc nimGetProcAddr(lib: LibHandle, name: cstring): ProcAddr = + writeToStdErr("nimGetProcAddr not implemented") + quit(1) elif defined(nintendoswitch) or defined(freertos): proc nimUnloadLibrary(lib: LibHandle) = -- 2.29.2 From a5abcb5a4ebf704642ada062da5c5a2a98668356 Mon Sep 17 00:00:00 2001 From: Emery Hemingway Date: Tue, 15 Oct 2019 10:19:27 +0200 Subject: [PATCH 3/7] Genode: use stricter dataspace type in page allocator --- lib/genode/alloc.nim | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/lib/genode/alloc.nim b/lib/genode/alloc.nim index a21a3ad7b..3ddd3074b 100644 --- a/lib/genode/alloc.nim +++ b/lib/genode/alloc.nim @@ -17,18 +17,18 @@ when not defined(genode): when not declared(GenodeEnv): include genode/env -type DataspaceCapability {. - importcpp: "Genode::Dataspace_capability", pure.} = object +type RamDataspaceCapability {. + importcpp: "Genode::Ram_dataspace_capability", pure.} = object type Map = object attachment: pointer size: int - ds: DataspaceCapability + ds: RamDataspaceCapability SlabMeta = object next: ptr MapSlab - ds: DataspaceCapability + ds: RamDataspaceCapability MapSlab = object meta: SlabMeta @@ -45,11 +45,11 @@ proc capsAvail(env: GenodeEnv): int {. ## Return the number of available capabilities. ## Each dataspace allocation consumes a capability. -proc allocDataspace(env: GenodeEnv; size: int): DataspaceCapability {. +proc allocDataspace(env: GenodeEnv; size: int): RamDataspaceCapability {. importcpp: "#->pd().alloc(@)".} ## Allocate a dataspace and its capability. -proc attachDataspace(env: GenodeEnv; ds: DataspaceCapability): pointer {. +proc attachDataspace(env: GenodeEnv; ds: RamDataspaceCapability): pointer {. importcpp: "#->rm().attach(@)".} ## Attach a dataspace into the component address-space. @@ -57,7 +57,7 @@ proc detachAddress(env: GenodeEnv; p: pointer) {. importcpp: "#->rm().detach(@)".} ## Detach a dataspace from the component address-space. -proc freeDataspace(env: GenodeEnv; ds: DataspaceCapability) {. +proc freeDataspace(env: GenodeEnv; ds: RamDataspaceCapability) {. importcpp: "#->pd().free(@)".} ## Free a dataspace. -- 2.29.2 From 88ec46acdb8cd9296389d7a783cab8b3973526e0 Mon Sep 17 00:00:00 2001 From: Emery Hemingway Date: Tue, 7 Apr 2020 10:03:13 +0530 Subject: [PATCH 4/7] Genode: remove compiler configuratin from nim.cfg Self-hosting Nim is not supported on Genode and defining the cross-compilation evironment is out-of-scope. --- config/nim.cfg | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/config/nim.cfg b/config/nim.cfg index a33a2f0a9..aab7941c7 100644 --- a/config/nim.cfg +++ b/config/nim.cfg @@ -299,23 +299,6 @@ tcc.options.always = "-w" @if genode: noCppExceptions # avoid std C++ tlsEmulation:on # no TLS segment register magic - @if i386 or amd64: - gcc.exe = "genode-x86-gcc" - gcc.cpp.exe = "genode-x86-g++" - gcc.cpp.linkerexe = "genode-x86-ld" - @elif arm: - gcc.exe = "genode-arm-gcc" - gcc.cpp.exe = "genode-arm-g++" - gcc.cpp.linkerexe = "genode-arm-ld" - @elif arm64: - gcc.exe = "genode-aarch64-gcc" - gcc.cpp.exe = "genode-aarch64-g++" - gcc.cpp.linkerexe = "genode-aarch64-ld" - @elif riscv64: - gcc.exe = "genode-riscv-gcc" - gcc.cpp.exe = "genode-riscv-g++" - gcc.cpp.linkerexe = "genode-riscv-ld" - @end @end @if arm or arm64: -- 2.29.2 From 117287e4f757d1136b7163a2fa64f1aa05f5841c Mon Sep 17 00:00:00 2001 From: Emery Hemingway Date: Tue, 7 Apr 2020 10:49:20 +0530 Subject: [PATCH 5/7] Genode: select POSIX or native NimMain --- compiler/cgen.nim | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/compiler/cgen.nim b/compiler/cgen.nim index ac977b32b..4daaec79b 100644 --- a/compiler/cgen.nim +++ b/compiler/cgen.nim @@ -14,7 +14,7 @@ import nversion, nimsets, msgs, bitsets, idents, types, ccgutils, os, ropes, math, passes, wordrecg, treetab, cgmeth, rodutils, renderer, cgendata, ccgmerge, aliases, - lowerings, tables, sets, ndi, lineinfos, pathutils, transf, enumtostr, + lowerings, strtabs, tables, sets, ndi, lineinfos, pathutils, transf, enumtostr, injectdestructors when not defined(leanCompiler): @@ -1443,10 +1443,20 @@ proc genMainProc(m: BModule) = GenodeNimMain = "extern Genode::Env *nim_runtime_env;$N" & - "extern void nim_component_construct(Genode::Env*);$N$N" & + "extern \"C\" void nim_component_construct(Genode::Env*);$N$N" & NimMainBody - ComponentConstruct = + GenodeComponentConstruct = + "void Component::construct(Genode::Env &env) {$N" & + "\t// Set Env used during runtime initialization$N" & + "\tnim_runtime_env = &env;$N" & + "\t// Initialize runtime and globals$N" & + MainProcs & + "\t// Call application construct$N" & + "\tnim_component_construct(&env);$N" & + "}$N$N" + + GenodePosixComponentConstruct = "void Libc::Component::construct(Libc::Env &env) {$N" & "\t// Set Env used during runtime initialization$N" & "\tnim_runtime_env = &env;$N" & @@ -1462,7 +1472,10 @@ proc genMainProc(m: BModule) = m.config.globalOptions * {optGenGuiApp, optGenDynLib} != {}: m.includeHeader("") elif m.config.target.targetOS == osGenode: - m.includeHeader("") + if m.config.symbols.hasKey "posix": + m.includeHeader("") + else: + m.includeHeader("") let initStackBottomCall = if m.config.target.targetOS == osStandalone or m.config.selectedGC == gcNone: "".rope @@ -1511,8 +1524,10 @@ proc genMainProc(m: BModule) = const otherMain = WinCDllMain appcg(m, m.s[cfsProcs], otherMain, []) elif m.config.target.targetOS == osGenode: - const otherMain = ComponentConstruct - appcg(m, m.s[cfsProcs], otherMain, []) + if m.config.symbols.hasKey "posix": + appcg(m, m.s[cfsProcs], GenodePosixComponentConstruct, []) + else: + appcg(m, m.s[cfsProcs], GenodeComponentConstruct, []) elif optGenDynLib in m.config.globalOptions: const otherMain = PosixCDllMain appcg(m, m.s[cfsProcs], otherMain, []) -- 2.29.2 From 28dadde5a935a0fd3df917f4266247e635306361 Mon Sep 17 00:00:00 2001 From: Emery Hemingway Date: Fri, 4 Dec 2020 12:53:51 +0100 Subject: [PATCH 6/7] Genode: use new mutex API --- lib/genode_cpp/syslocks.h | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/lib/genode_cpp/syslocks.h b/lib/genode_cpp/syslocks.h index 8ba39abc2..c50180903 100644 --- a/lib/genode_cpp/syslocks.h +++ b/lib/genode_cpp/syslocks.h @@ -13,7 +13,7 @@ /* Genode includes */ #include -#include +#include namespace Nim { struct SysLock; @@ -22,15 +22,14 @@ namespace Nim { struct Nim::SysLock { - Genode::Lock _lock_a, _lock_b; + Genode::Mutex _mutex_a, _mutex_b; bool _locked; void acquireSys() { - _lock_a.lock(); + Genode::Mutex::Guard guard(_mutex_a); _locked = true; - _lock_a.unlock(); - _lock_b.lock(); + _mutex_b.acquire(); } bool tryAcquireSys() @@ -38,23 +37,22 @@ struct Nim::SysLock if (_locked) return false; - _lock_a.lock(); + Genode::Mutex::Guard guard(_mutex_a); + if (_locked) { - _lock_a.unlock(); return false; } else { _locked = true; - _lock_b.lock(); - _lock_a.unlock(); + _mutex_b.acquire(); return true; } } void releaseSys() { + Genode::Mutex::Guard guard(_mutex_a); _locked = false; - _lock_a.unlock(); - _lock_b.unlock(); + _mutex_b.release(); } }; -- 2.29.2 From 6f0ac2fb946c804e2624bb7d17ae76fc0074f85e Mon Sep 17 00:00:00 2001 From: Emery Hemingway Date: Thu, 18 Feb 2021 18:45:29 +0100 Subject: [PATCH 7/7] Genode: do not pass -ldl to linker --- config/nim.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/nim.cfg b/config/nim.cfg index aab7941c7..53bf8e8bb 100644 --- a/config/nim.cfg +++ b/config/nim.cfg @@ -111,7 +111,7 @@ path="$lib/pure" @end @if unix: - @if not bsd or haiku: + @if not bsd or haiku or genode: # -fopenmp gcc.options.linker = "-ldl" gcc.cpp.options.linker = "-ldl" -- 2.29.2