This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [3.1] More regressions on S/390 - revert lib64 patch
- From: Alan Modra <amodra at bigpond dot net dot au>
- To: Ulrich Weigand <Ulrich dot Weigand at de dot ibm dot com>
- Cc: gcc-patches at gcc dot gnu dot org
- Date: Sat, 27 Apr 2002 09:42:07 +0930
- Subject: Re: [3.1] More regressions on S/390 - revert lib64 patch
- References: <OF811DA05C.CAFD7EAB-ONC1256BA7.006253B6@de.ibm.com>
On Fri, Apr 26, 2002 at 09:01:31PM +0200, Ulrich Weigand wrote:
> Due to this change, the start files (crti.o etc.) are now always used
> from the absolute path given (/usr/lib/crti.o or /usr/lib64/crti.o).
Since this has come up, I'll present my solution, a new spec to
tweak default compiler search paths. Developed for powerpc64,
but with x86_64, s390 etc. people in mind. x86_64 will be able
to do something like:
#define STARTFILE_PREFIX_SPEC "\
%{m32: /usr/local/lib/ /lib/ /usr/lib/} \
%{!m32: /usr/local/lib64/ /lib64/ /usr/lib64/}"
and then get rid of those ugly absolute paths in STARTFILE_SPEC
and ENDFILE_SPEC.
Some notes: The configure change is obviously incomplete as regards
target lists. It's there because we want to distinguish a "real"
cross-compiler, say x86-linux -> powerpc64-linux where we don't want
to mess around looking in /lib64, and a sort-of-native cross-compiler
like powerpc-linux -> powerpc64-linux, where we know ppc64 libs can
be found in /lib64.
* configure.in (CROSS): Define NATIVE_CROSS.
* gcc.c (STARTFILE_PREFIX_SPEC): Define.
(startfile_prefix_spec): New var.
(static_specs): Add startfile_prefix_spec.
(do_spec_2): Split out from..
(do_spec): ..here.
(find_file): Constify newname. Formatting fix.
(main): Process startfile_prefix_spec.
* config/rs6000/linux64.h (LINK_OS_LINUX_SPEC) Add -Y, change name
of dynamic linker.
(STARTFILE_PREFIX_SPEC): Define.
(STARTFILE_LINUX_SPEC, ENDFILE_LINUX_SPEC): Rewrite without
absolute paths.
diff -urpN -xCVS -x'*~' -xTAGS gcc-ppc64-31.orig/gcc/configure.in gcc-ppc64-31/gcc/configure.in
--- gcc-ppc64-31.orig/gcc/configure.in 2002-04-17 18:46:12.000000000 +0930
+++ gcc-ppc64-31/gcc/configure.in 2002-04-24 15:48:04.000000000 +0930
@@ -1086,6 +1086,11 @@ then
CROSS="-DCROSS_COMPILE"
ALL=all.cross
SYSTEM_HEADER_DIR='$(CROSS_SYSTEM_HEADER_DIR)'
+ case "$host","$target" in
+ i?86-*-*,x86_64-*-* \
+ | powerpc*-*-*,powerpc64*-*-*)
+ CROSS="$CROSS -DNATIVE_CROSS" ;;
+ esac
fi
# If this is a cross-compiler that does not
diff -urpN -xCVS -x'*~' -xTAGS gcc-ppc64-31.orig/gcc/gcc.c gcc-ppc64-31/gcc/gcc.c
--- gcc-ppc64-31.orig/gcc/gcc.c 2002-04-17 18:46:39.000000000 +0930
+++ gcc-ppc64-31/gcc/gcc.c 2002-04-24 18:01:23.000000000 +0930
@@ -299,6 +299,7 @@ static const char *handle_braces PARAMS
static char *save_string PARAMS ((const char *, int));
static void set_collect_gcc_options PARAMS ((void));
static int do_spec_1 PARAMS ((const char *, int, const char *));
+static int do_spec_2 PARAMS ((const char *));
static const char *find_file PARAMS ((const char *));
static int is_directory PARAMS ((const char *, const char *, int));
static void validate_switches PARAMS ((const char *));
@@ -641,6 +642,10 @@ proper position among the other output f
# endif
#endif
+#ifndef STARTFILE_PREFIX_SPEC
+# define STARTFILE_PREFIX_SPEC ""
+#endif
+
static const char *asm_debug = ASM_DEBUG_SPEC;
static const char *cpp_spec = CPP_SPEC;
static const char *cpp_predefines = CPP_PREDEFINES;
@@ -658,6 +663,7 @@ static const char *switches_need_spaces
static const char *linker_name_spec = LINKER_NAME;
static const char *link_command_spec = LINK_COMMAND_SPEC;
static const char *link_libgcc_spec = LINK_LIBGCC_SPEC;
+static const char *startfile_prefix_spec = STARTFILE_PREFIX_SPEC;
/* Standard options to cpp, cc1, and as, to reduce duplication in specs.
There should be no need to override these in target dependent files,
@@ -1394,6 +1400,7 @@ static struct spec_list static_specs[] =
INIT_STATIC_SPEC ("md_exec_prefix", &md_exec_prefix),
INIT_STATIC_SPEC ("md_startfile_prefix", &md_startfile_prefix),
INIT_STATIC_SPEC ("md_startfile_prefix_1", &md_startfile_prefix_1),
+ INIT_STATIC_SPEC ("startfile_prefix_spec", &startfile_prefix_spec),
};
#ifdef EXTRA_SPECS /* additional specs needed */
@@ -4176,15 +4183,7 @@ do_spec (spec)
{
int value;
- clear_args ();
- arg_going = 0;
- delete_this_arg = 0;
- this_is_output_file = 0;
- this_is_library_file = 0;
- input_from_pipe = 0;
- suffix_subst = NULL;
-
- value = do_spec_1 (spec, 0, NULL);
+ value = do_spec_2 (spec);
/* Force out any unfinished command.
If -pipe, this forces out the last command if it ended in `|'. */
@@ -4202,6 +4201,21 @@ do_spec (spec)
return value;
}
+static int
+do_spec_2 (spec)
+ const char *spec;
+{
+ clear_args ();
+ arg_going = 0;
+ delete_this_arg = 0;
+ this_is_output_file = 0;
+ this_is_library_file = 0;
+ input_from_pipe = 0;
+ suffix_subst = NULL;
+
+ return do_spec_1 (spec, 0, NULL);
+}
+
/* Process the sub-spec SPEC as a portion of a larger spec.
This is like processing a whole spec except that we do
not initialize at the beginning and we do not supply a
@@ -5612,13 +5626,14 @@ static const char *
find_file (name)
const char *name;
{
- char *newname;
+ const char *newname;
/* Try multilib_dir if it is defined. */
if (multilib_dir != NULL)
{
- const char *const try = ACONCAT ((multilib_dir, dir_separator_str, name, NULL));
+ const char *try;
+ try = ACONCAT ((multilib_dir, dir_separator_str, name, NULL));
newname = find_a_file (&startfile_prefixes, try, R_OK);
/* If we don't find it in the multi library dir, then fall
@@ -5940,6 +5955,16 @@ main (argc, argv)
"BINUTILS", PREFIX_PRIORITY_LAST, 0, NULL);
}
+ if (*startfile_prefix_spec
+ && do_spec_2 (startfile_prefix_spec) == 0
+ && do_spec_1 (" ", 0, NULL) == 0)
+ {
+ int ndx;
+ for (ndx = 0; ndx < argbuf_index; ndx++)
+ add_prefix (&startfile_prefixes, argbuf[ndx], "BINUTILS",
+ PREFIX_PRIORITY_LAST, 0, NULL);
+ }
+
/* Process any user specified specs in the order given on the command
line. */
for (uptr = user_specs_head; uptr; uptr = uptr->next)
diff -urpN -xCVS -x'*~' -xTAGS gcc-ppc64-31.orig/gcc/config/rs6000/linux64.h gcc-ppc64-31/gcc/config/rs6000/linux64.h
--- gcc-ppc64-31.orig/gcc/config/rs6000/linux64.h 2002-04-12 22:32:56.000000000 +0930
+++ gcc-ppc64-31/gcc/config/rs6000/linux64.h 2002-04-24 15:33:59.000000000 +0930
@@ -100,6 +100,7 @@ Boston, MA 02111-1307, USA. */
/* Don't assume anything about the header files. */
#define NO_IMPLICIT_EXTERN_C
+/* Override svr4.h */
#undef MD_EXEC_PREFIX
#undef MD_STARTFILE_PREFIX
@@ -138,29 +139,24 @@ Boston, MA 02111-1307, USA. */
#define LINK_OS_DEFAULT_SPEC "%(link_os_linux)"
#undef LINK_OS_LINUX_SPEC
-#ifndef CROSS_COMPILE
-#define LINK_OS_LINUX_SPEC "-m elf64ppc %{!shared: %{!static: \
+#define LINK_OS_LINUX_SPEC "-m elf64ppc -Y /usr/local/lib64:/lib64:/usr/lib64 \
+%{!shared: %{!static: \
%{rdynamic:-export-dynamic} \
- %{!dynamic-linker:-dynamic-linker /lib64/ld.so.1}}}"
-#else
-#define LINK_OS_LINUX_SPEC "-m elf64ppc %{!shared: %{!static: \
- %{rdynamic:-export-dynamic} \
- %{!dynamic-linker:-dynamic-linker ld.so.1}}}"
+ %{!dynamic-linker:-dynamic-linker /lib64/ld64.so.1}}}"
+
+#ifdef NATIVE_CROSS
+#define STARTFILE_PREFIX_SPEC "/usr/local/lib64/ /lib64/ /usr/lib64/"
#endif
-#ifndef CROSS_COMPILE
#undef STARTFILE_LINUX_SPEC
#define STARTFILE_LINUX_SPEC "\
-%{!shared: %{pg:/usr/lib64/gcrt1.o%s} %{!pg:%{p:/usr/lib64/gcrt1.o%s} \
- %{!p:/usr/lib64/crt1.o%s}}} /usr/lib64/crti.o%s \
-%{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s}"
-#endif
+%{!shared: %{pg:gcrt1.o%s} %{!pg:%{p:gcrt1.o%s} %{!p:crt1.o%s}}} crti.o%s \
+%{static:crtbeginT.o%s} \
+%{!static:%{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s}}"
-#ifndef CROSS_COMPILE
#undef ENDFILE_LINUX_SPEC
#define ENDFILE_LINUX_SPEC "\
-%{!shared:crtend.o%s} %{shared:crtendS.o%s} /usr/lib64/crtn.o%s"
-#endif
+%{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s"
#undef TOC_SECTION_ASM_OP
#define TOC_SECTION_ASM_OP "\t.section\t\".toc\",\"aw\""
--
Alan Modra
IBM OzLabs - Linux Technology Centre