The linker option approach works for me too. My patch was an attempt to address the problem without touching linker options, but if ghnggen already handles it that way, doing the same in vlnggen seems fine. I didn't know about ghnggen.
Verilator declares sc_time_stamp() as a weak symbol. It means the user may optionally define it. Linux ld tolerates a missing weak symbol, macOS ld doesn't. The shim (verilator_shim.cpp) never actually calls sc_time_stamp() (time is driven via VerilatedContext::time()), so adding an empty stub there (attached patch) satisfies macOS ld without any vlnggen change.