Browse Source

Merge pull request #3067 from Platin21/fix/macos-no-duplicated-linkage

Fix/macos no duplicated linkage
Jeroen van Rijn 1 year ago
parent
commit
cb1c10ce83
3 changed files with 27 additions and 1 deletions
  1. 19 1
      src/linker.cpp
  2. 4 0
      src/llvm_backend_general.cpp
  3. 4 0
      src/tilde.cpp

+ 19 - 1
src/linker.cpp

@@ -7,10 +7,19 @@ struct LinkerData {
 	Array<String> output_temp_paths;
 	Array<String> output_temp_paths;
 	String   output_base;
 	String   output_base;
 	String   output_name;
 	String   output_name;
+#if defined(GB_SYSTEM_OSX)
+	b8       needs_system_library_linked;
+#endif
 };
 };
 
 
 gb_internal i32 system_exec_command_line_app(char const *name, char const *fmt, ...);
 gb_internal i32 system_exec_command_line_app(char const *name, char const *fmt, ...);
 
 
+#if defined(GB_SYSTEM_OSX)
+gb_internal void linker_enable_system_library_linking(LinkerData *ld) {
+	ld->needs_system_library_linked = 1;
+}
+#endif
+
 gb_internal void linker_data_init(LinkerData *ld, CheckerInfo *info, String const &init_fullpath) {
 gb_internal void linker_data_init(LinkerData *ld, CheckerInfo *info, String const &init_fullpath) {
 	gbAllocator ha = heap_allocator();
 	gbAllocator ha = heap_allocator();
 	array_init(&ld->output_object_paths, ha);
 	array_init(&ld->output_object_paths, ha);
@@ -18,6 +27,10 @@ gb_internal void linker_data_init(LinkerData *ld, CheckerInfo *info, String cons
 	array_init(&ld->foreign_libraries,   ha, 0, 1024);
 	array_init(&ld->foreign_libraries,   ha, 0, 1024);
 	ptr_set_init(&ld->foreign_libraries_set, 1024);
 	ptr_set_init(&ld->foreign_libraries_set, 1024);
 
 
+#if defined(GB_SYSTEM_OSX)
+	ld->needs_system_library_linked = 0;
+#endif 
+
 	if (build_context.out_filepath.len == 0) {
 	if (build_context.out_filepath.len == 0) {
 		ld->output_name = remove_directory_from_path(init_fullpath);
 		ld->output_name = remove_directory_from_path(init_fullpath);
 		ld->output_name = remove_extension_from_path(ld->output_name);
 		ld->output_name = remove_extension_from_path(ld->output_name);
@@ -470,7 +483,12 @@ gb_internal i32 linker_stage(LinkerData *gen) {
 			gbString platform_lib_str = gb_string_make(heap_allocator(), "");
 			gbString platform_lib_str = gb_string_make(heap_allocator(), "");
 			defer (gb_string_free(platform_lib_str));
 			defer (gb_string_free(platform_lib_str));
 			if (build_context.metrics.os == TargetOs_darwin) {
 			if (build_context.metrics.os == TargetOs_darwin) {
-				platform_lib_str = gb_string_appendc(platform_lib_str, "-lSystem -lm -Wl,-syslibroot /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk -L/usr/local/lib");
+				platform_lib_str = gb_string_appendc(platform_lib_str, "-lm -Wl,-syslibroot /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk -L/usr/local/lib");
+				#if defined(GB_SYSTEM_OSX)
+				if(gen->needs_system_library_linked == 1) {
+					platform_lib_str = gb_string_appendc(platform_lib_str, " -lSystem ");
+				}
+				#endif
 			} else {
 			} else {
 				platform_lib_str = gb_string_appendc(platform_lib_str, "-lc -lm");
 				platform_lib_str = gb_string_appendc(platform_lib_str, "-lc -lm");
 			}
 			}

+ 4 - 0
src/llvm_backend_general.cpp

@@ -107,6 +107,10 @@ gb_internal bool lb_init_generator(lbGenerator *gen, Checker *c) {
 	String init_fullpath = c->parser->init_fullpath;
 	String init_fullpath = c->parser->init_fullpath;
 	linker_data_init(gen, &c->info, init_fullpath);
 	linker_data_init(gen, &c->info, init_fullpath);
 
 
+	#if defined(GB_SYSTEM_OSX) && (LLVM_VERSION_MAJOR < 14)
+	linker_enable_system_library_linking(gen);
+	#endif
+
 	gen->info = &c->info;
 	gen->info = &c->info;
 
 
 	map_init(&gen->modules, gen->info->packages.count*2);
 	map_init(&gen->modules, gen->info->packages.count*2);

+ 4 - 0
src/tilde.cpp

@@ -726,6 +726,10 @@ gb_internal bool cg_generate_code(Checker *c, LinkerData *linker_data) {
 
 
 	linker_data_init(linker_data, info, c->parser->init_fullpath);
 	linker_data_init(linker_data, info, c->parser->init_fullpath);
 
 
+	#if defined(GB_SYSTEM_OSX)
+		linker_enable_system_library_linking(linker_data);
+	#endif
+
 	cg_global_arena_init();
 	cg_global_arena_init();
 
 
 	cgModule *m = cg_module_create(c);
 	cgModule *m = cg_module_create(c);