From 48aec0bcc62585f949362e8c875fc039d306cb7f Mon Sep 17 00:00:00 2001 From: Devang Patel <dpatel@apple.com> Date: Tue, 10 Dec 2002 12:20:47 -0800 Subject: [PATCH] Add support for darwin linker options. * config/darwin.h(LINK_SPEC): Add darwin specific linker options. * doc/invoke.texi: Add new "Darwin Options" section. From-SVN: r60010 --- gcc/ChangeLog | 4 + gcc/config/darwin.h | 186 +++++++++++++++++++++++++++++++++++++++++++- gcc/doc/invoke.texi | 155 ++++++++++++++++++++++++++++++++++++ 3 files changed, 342 insertions(+), 3 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3b506ef19b7f..112e5a9a6826 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,7 @@ +2002-12-10 Devang Patel <dpatel@appple.com> + * config/darwin.h(LINK_SPEC): Add darwin specific linker options. + * doc/invoke.texi: Add new "Darwin Options" section. + 2002-12-10 Jim Wilson <wilson@redhat.com> * rs6000.h (RETURN_IN_MEMORY): If ABI_V4, then TFmode is returned in diff --git a/gcc/config/darwin.h b/gcc/config/darwin.h index 27ce49f5d592..7997a46e7a54 100644 --- a/gcc/config/darwin.h +++ b/gcc/config/darwin.h @@ -84,11 +84,184 @@ Boston, MA 02111-1307, USA. */ #undef DEFAULT_PCC_STRUCT_RETURN #define DEFAULT_PCC_STRUCT_RETURN 0 +/* This table intercepts weirdo options whose names would interfere + with normal driver conventions, and either translates them into + standardly-named options, or adds a 'Z' so that they can get to + specs processing without interference. + + Do not expand a linker option to "-Xlinker -<option>", since that + forfeits the ability to control via spec strings later. However, + as a special exception, do this translation with -filelist, because + otherwise the driver will think there are no input files and quit. + (The alternative would be to hack the driver to recognize -filelist + specially, but it's simpler to use the translation table.) + + Note that an option name with a prefix that matches another option + name, that also takes an argument, needs to be modified so the + prefix is different, otherwise a '*' after the shorter option will + match with the longer one. */ +/* Ignore -dynamic for now */ +#define TARGET_OPTION_TRANSLATE_TABLE \ + { "-all_load", "-Zall_load" }, \ + { "-allowable_client", "-Zallowable_client" }, \ + { "-arch_errors_fatal", "-Zarch_errors_fatal" }, \ + { "-bind_at_load", "-Zbind_at_load" }, \ + { "-bundle", "-Zbundle" }, \ + { "-bundle_loader", "-Zbundle_loader" }, \ + { "-weak_reference_mismatches", "-Zweak_reference_mismatches" }, \ + { "-dependency-file", "-MF" }, \ + { "-dylib_file", "-Zdylib_file" }, \ + { "-dynamic", " " }, \ + { "-dynamiclib", "-Zdynamiclib" }, \ + { "-exported_symbols_list", "-Zexported_symbols_list" }, \ + { "-seg_addr_table_filename", "-Zseg_addr_table_filename" }, \ + { "-filelist", "-Xlinker -filelist -Xlinker" }, \ + { "-flat_namespace", "-Zflat_namespace" }, \ + { "-force_cpusubtype_ALL", "-Zforce_cpusubtype_ALL" }, \ + { "-force_flat_namespace", "-Zforce_flat_namespace" }, \ + { "-image_base", "-Zimage_base" }, \ + { "-init", "-Zinit" }, \ + { "-install_name", "-Zinstall_name" }, \ + { "-multiply_defined_unused", "-Zmultiplydefinedunused" }, \ + { "-multiply_defined", "-Zmultiply_defined" }, \ + { "-multi_module", "-Zmulti_module" }, \ + { "-static", "-static -Wa,-static" }, \ + { "-single_module", "-Zsingle_module" }, \ + { "-unexported_symbols_list", "-Zunexported_symbols_list" } + +/* These compiler options take n arguments. */ + +#undef WORD_SWITCH_TAKES_ARG +#define WORD_SWITCH_TAKES_ARG(STR) \ + (DEFAULT_WORD_SWITCH_TAKES_ARG (STR) ? 1 : \ + !strcmp (STR, "Zallowable_client") ? 1 : \ + !strcmp (STR, "arch") ? 1 : \ + !strcmp (STR, "arch_only") ? 1 : \ + !strcmp (STR, "Zbundle_loader") ? 1 : \ + !strcmp (STR, "client_name") ? 1 : \ + !strcmp (STR, "compatibility_version") ? 1 : \ + !strcmp (STR, "current_version") ? 1 : \ + !strcmp (STR, "Zdylib_file") ? 1 : \ + !strcmp (STR, "Zexported_symbols_list") ? 1 : \ + !strcmp (STR, "Zimage_base") ? 1 : \ + !strcmp (STR, "Zinit") ? 1 : \ + !strcmp (STR, "Zinstall_name") ? 1 : \ + !strcmp (STR, "Zmultiplydefinedunused") ? 1 : \ + !strcmp (STR, "Zmultiply_defined") ? 1 : \ + !strcmp (STR, "precomp-trustfile") ? 1 : \ + !strcmp (STR, "read_only_relocs") ? 1 : \ + !strcmp (STR, "sectcreate") ? 3 : \ + !strcmp (STR, "sectorder") ? 3 : \ + !strcmp (STR, "Zseg_addr_table_filename") ?1 :\ + !strcmp (STR, "seg1addr") ? 1 : \ + !strcmp (STR, "segprot") ? 3 : \ + !strcmp (STR, "seg_addr_table") ? 1 : \ + !strcmp (STR, "sub_library") ? 1 : \ + !strcmp (STR, "sub_umbrella") ? 1 : \ + !strcmp (STR, "umbrella") ? 1 : \ + !strcmp (STR, "undefined") ? 1 : \ + !strcmp (STR, "Zunexported_symbols_list") ? 1 : \ + !strcmp (STR, "Zweak_reference_mismatches") ? 1 : \ + !strcmp (STR, "pagezero_size") ? 1 : \ + !strcmp (STR, "segs_read_only_addr") ? 1 : \ + !strcmp (STR, "segs_read_write_addr") ? 1 : \ + !strcmp (STR, "sectalign") ? 3 : \ + !strcmp (STR, "sectobjectsymbols") ? 2 : \ + !strcmp (STR, "segcreate") ? 3 : \ + !strcmp (STR, "dylinker_install_name") ? 1 : \ + 0) + /* Machine dependent cpp options. */ #undef CPP_SPEC #define CPP_SPEC "%{static:-D__STATIC__}%{!static:-D__DYNAMIC__}" +/* This is mostly a clone of the standard LINK_COMMAND_SPEC, plus + precomp, libtool, and fat build additions. Also we + don't specify a second %G after %L because libSystem is + self-contained and doesn't need to link against libgcc.a. */ +/* In general, random Darwin linker flags should go into LINK_SPEC + instead of LINK_COMMAND_SPEC. The command spec is better for + specifying the handling of options understood by generic Unix + linkers, and for positional arguments like libraries. */ +#define LINK_COMMAND_SPEC "\ +%{!fdump=*:%{!fsyntax-only:%{!precomp:%{!c:%{!M:%{!MM:%{!E:%{!S:\ + %{!Zdynamiclib:%(linker)}%{Zdynamiclib:/usr/bin/libtool} \ + %l %X %{d} %{s} %{t} %{Z} \ + %{!Zdynamiclib:%{A} %{e*} %{m} %{N} %{n} %{r} %{u*} %{x} %{z}} \ + %{@:-o %f%u.out}%{!@:%{o*}%{!o:-o a.out}} \ + %{!Zdynamiclib:%{!A:%{!nostdlib:%{!nostartfiles:%S}}}} \ + %{L*} %(link_libgcc) %o %{!nostdlib:%{!nodefaultlibs:%G %L}} \ + %{!A:%{!nostdlib:%{!nostartfiles:%E}}} %{T*} %{F*} \ + %{!--help:%{!no-c++filt|c++filt:| c++filt3 }} }}}}}}}}" + +/* Please keep the random linker options in alphabetical order (modulo + 'Z' and 'no' prefixes). Options that can only go to one of libtool + or ld must be listed twice, under both !Zdynamiclib and + Zdynamiclib, with one of the cases reporting an error. */ +/* Note that options taking arguments may appear multiple times on a + command line with different arguments each time, so put a * after + their names so all of them get passed. */ +#define LINK_SPEC \ + "%{static}%{!static:-dynamic} \ + %{!Zdynamiclib: \ + %{Zbundle:-bundle} \ + %{Zbundle_loader*:-bundle_loader %*} \ + %{client_name*} \ + %{compatibility_version*:%e-compatibility_version only allowed with -dynamiclib\ +} \ + %{current_version*:%e-current_version only allowed with -dynamiclib} \ + %{Zforce_cpusubtype_ALL:-force_cpusubtype_ALL} \ + %{Zforce_flat_namespace:-force_flat_namespace} \ + %{Zinstall_name*:%e-install_name only allowed with -dynamiclib} \ + %{keep_private_externs} \ + %{private_bundle} \ + } \ + %{Zdynamiclib: \ + %{Zbundle:%e-bundle not allowed with -dynamiclib} \ + %{Zbundle_loader*:%e-bundle_loader not allowed with -dynamiclib} \ + %{client_name*:%e-client_name not allowed with -dynamiclib} \ + %{compatibility_version*} \ + %{current_version*} \ + %{Zforce_cpusubtype_ALL:%e-force_cpusubtype_ALL not allowed with -dynamiclib} \ + %{Zforce_flat_namespace:%e-force_flat_namespace not allowed with -dynamiclib} \ + %{Zinstall_name*:-install_name %*} \ + %{keep_private_externs:%e-keep_private_externs not allowed with -dynamiclib} \ + %{private_bundle:%e-private_bundle not allowed with -dynamiclib} \ + } \ + %{Zall_load:-all_load}%{Zdynamiclib:%{!Zall_load:-noall_load}} \ + %{Zallowable_client*:-allowable_client %*} \ + %{Zbind_at_load:-bind_at_load} \ + %{Zarch_errors_fatal:-arch_errors_fatal} \ + %{Zdylib_file*:-dylib_file %*} \ + %{Zexported_symbols_list*:-exported_symbols_list %*} \ + %{Zflat_namespace:-flat_namespace} \ + %{headerpad_max_install_names*} \ + %{Zimage_base*:-image_base %*} \ + %{Zinit*:-init %*} \ + %{nomultidefs} \ + %{Zmulti_module:-multi_module} %{Zsingle_module:-single_module} \ + %{Zmultiply_defined*:-multiply_defined %*} \ + %{Zmultiplydefinedunused*:-multiply_defined_unused %*} \ + %{prebind} %{noprebind} %{prebind_all_twolevel_modules} \ + %{read_only_relocs} \ + %{sectcreate*} %{sectorder*} %{seg1addr*} %{segprot*} %{seg_addr_table*} \ + %{Zseg_addr_table_filename*:-seg_addr_table_filename %*} \ + %{sub_library*} %{sub_umbrella*} \ + %{twolevel_namespace} %{twolevel_namespace_hints} \ + %{umbrella*} \ + %{undefined*} \ + %{Zunexported_symbols_list*:-unexported_symbols_list %*} \ + %{Zweak_reference_mismatches*:-weak_reference_mismatches %*} \ + %{X} \ + %{y*} \ + %{w} \ + %{pagezero_size*} %{segs_read_*} %{seglinkedit} %{noseglinkedit} \ + %{sectalign*} %{sectobjectsymbols*} %{segcreate*} %{whyload} \ + %{whatsloaded} %{dylinker_install_name*} \ + %{dylinker} %{Mach} " + + /* Machine dependent libraries. */ #undef LIB_SPEC @@ -96,10 +269,17 @@ Boston, MA 02111-1307, USA. */ /* We specify crt0.o as -lcrt0.o so that ld will search the library path. */ -#undef STARTFILE_SPEC +#undef STARTFILE_SPEC #define STARTFILE_SPEC \ - "%{pg:%{static:-lgcrt0.o}%{!static:-lgcrt1.o} -lcrt2.o} \ - %{!pg:%{static:-lcrt0.o}%{!static:-lcrt1.o} -lcrt2.o}" + "%{!Zdynamiclib:%{Zbundle:%{!static:-lbundle1.o}} \ + %{!Zbundle:%{pg:%{static:-lgcrt0.o} \ + %{!static:%{object:-lgcrt0.o} \ + %{!object:%{preload:-lgcrt0.o} \ + %{!preload:-lgcrt1.o -lcrt2.o}}}} \ + %{!pg:%{static:-lcrt0.o} \ + %{!static:%{object:-lcrt0.o} \ + %{!object:%{preload:-lcrt0.o} \ + %{!preload:-lcrt1.o -lcrt2.o}}}}}}" /* The native Darwin linker doesn't necessarily place files in the order that they're specified on the link line. Thus, it is pointless diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index 38aab0d1bce3..4589dd13bbba 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -463,6 +463,28 @@ in the following sections. -msim -mmvme -mads -myellowknife -memb -msdata @gol -msdata=@var{opt} -mvxworks -mwindiss -G @var{num} -pthread} +@emph{Darwin Options} +@gccoptlist{ +-all_load -allowable_client -arch -arch_errors_fatal @gol +-arch_only -bind_at_load -bundle -bundle_loader @gol +-client_name -compatibility_version -current_version @gol +-dependency-file -dylib_file -dylinker_install_name @gol +-dynamic -dynamiclib -exported_symbols_list @gol +-filelist -flat_namespace -force_cpusubtype_ALL @gol +-force_flat_namespace -headerpad_max_install_names @gol +-image_base -init -install_name -keep_private_externs @gol +-multi_module -multiply_defined -multiply_defined_unused @gol +-noall_load -nomultidefs -noprebind -noseglinkedit @gol +-pagezero_size -prebind -prebind_all_twolevel_modules @gol +-private_bundle -read_only_relocs -sectalign @gol +-sectobjectsymbols -whyload -seg1addr @gol +-sectcreate -sectobjectsymbols -sectorder @gol +-seg_addr_table -seg_addr_table_filename -seglinkedit @gol +-segprot -segs_read_only_addr -segs_read_write_addr @gol +-single_module -static -sub_library -sub_umbrella @gol +-twolevel_namespace -umbrella -undefined @gol +-unexported_symbols_list -weak_reference_mismatches -whatsloaded} + @emph{RT Options} @gccoptlist{ -mcall-lib-mul -mfp-arg-in-fpregs -mfp-arg-in-gregs @gol @@ -5202,6 +5224,7 @@ that macro, which enables you to change the defaults. * M32R/D Options:: * M88K Options:: * RS/6000 and PowerPC Options:: +* Darwin Options:: * RT Options:: * MIPS Options:: * i386 and x86-64 Options:: @@ -7227,6 +7250,138 @@ This option sets flags for both the preprocessor and linker. @end table +@node Darwin Options +@subsection Darwin Options +@cindex Darwin options +@table @gcctabopt +@item -all_load +@item -allowable_client +@item -arch +@item -arch_errors_fatal +@item -arch_only +@item -bind_at_load +@item -bundle +@item -bundle_loader +@item -client_name +@item -compatibility_version +@item -current_version +@item -dependency-file +@item -dylib_file +@item -dylinker_install_name +@item -dynamic +@item -dynamiclib +@item -exported_symbols_list +@item -filelist +@item -flat_namespace +@item -force_cpusubtype_ALL +@item -force_flat_namespace +@item -headerpad_max_install_names +@item -image_base +@item -init +@item -install_name +@item -keep_private_externs +@item -multi_module +@item -multiply_defined +@item -multiply_defined_unused +@item -noall_load +@item -nomultidefs +@item -noprebind +@item -noseglinkedit +@item -pagezero_size +@item -prebind +@item -prebind_all_twolevel_modules +@item -private_bundle +@item -read_only_relocs +@item -sectalign +@item -sectobjectsymbols +@item -whyload +@item -seg1addr +@item -sectcreate +@item -sectobjectsymbols +@item -sectorder +@item -seg_addr_table +@item -seg_addr_table_filename +@item -seglinkedit +@item -segprot +@item -segs_read_only_addr +@item -segs_read_write_addr +@item -single_module +@item -static +@item -sub_library +@item -sub_umbrella +@item -twolevel_namespace +@item -umbrella +@item -undefined +@item -unexported_symbols_list +@item -weak_reference_mismatches +@item -whatsloaded +@opindex all_load +@opindex allowable_client +@opindex arch +@opindex arch_errors_fatal +@opindex arch_only +@opindex bind_at_load +@opindex bundle +@opindex bundle_loader +@opindex client_name +@opindex compatibility_version +@opindex current_version +@opindex dependency-file +@opindex dylib_file +@opindex dylinker_install_name +@opindex dynamic +@opindex dynamiclib +@opindex exported_symbols_list +@opindex filelist +@opindex flat_namespace +@opindex force_cpusubtype_ALL +@opindex force_flat_namespace +@opindex headerpad_max_install_names +@opindex image_base +@opindex init +@opindex install_name +@opindex keep_private_externs +@opindex multi_module +@opindex multiply_defined +@opindex multiply_defined_unused +@opindex noall_load +@opindex nomultidefs +@opindex noprebind +@opindex noseglinkedit +@opindex pagezero_size +@opindex prebind +@opindex prebind_all_twolevel_modules +@opindex private_bundle +@opindex read_only_relocs +@opindex sectalign +@opindex sectobjectsymbols +@opindex whyload +@opindex seg1addr +@opindex sectcreate +@opindex sectobjectsymbols +@opindex sectorder +@opindex seg_addr_table +@opindex seg_addr_table_filename +@opindex seglinkedit +@opindex segprot +@opindex segs_read_only_addr +@opindex segs_read_write_addr +@opindex single_module +@opindex static +@opindex sub_library +@opindex sub_umbrella +@opindex twolevel_namespace +@opindex umbrella +@opindex undefined +@opindex unexported_symbols_list +@opindex weak_reference_mismatches +@opindex whatsloaded + +This options are available for Darwin linker. Darwin linker man page +describes them in detail. +@end table + + @node RT Options @subsection IBM RT Options @cindex RT options -- GitLab