summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Rix <trix@redhat.com>2001-12-03 23:15:28 +0000
committerTom Rix <trix@redhat.com>2001-12-03 23:15:28 +0000
commit4746eebff61314f753316896e9cbab4968b00966 (patch)
treef3c6572776cbde7d40d45fd03cf49110f849da58
parent3c05c21fdbd0b592cabba8ae223b6669c35da5b0 (diff)
downloadbinutils-redhat-4746eebff61314f753316896e9cbab4968b00966.tar.gz
Pass argc and argv to ldemul_choose_target.
Support -b64 in AIX
-rw-r--r--ld/ChangeLog15
-rw-r--r--ld/Makefile.in4
-rw-r--r--ld/configure.tgt6
-rw-r--r--ld/emultempl/aix.em77
-rw-r--r--ld/emultempl/gld960.em6
-rw-r--r--ld/emultempl/gld960c.em6
-rw-r--r--ld/ldemul.c11
-rw-r--r--ld/ldemul.h6
-rw-r--r--ld/ldmain.c2
-rw-r--r--ld/scripttempl/aix.sc2
10 files changed, 104 insertions, 31 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog
index a07f056794..c123de2090 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,18 @@
+2001-12-02 Tom Rix <trix@redhat.com>
+
+ * configure.tgt : Remove eaixppc64 emulations.
+ * Makefile.in : Remove eaixppc64.c
+ * ldemul.c (ldemul_choose_target): New parameters argc, argv.
+ (ldemul_default_target): Same.
+ * emultempl/gld960.em (gld960_choose_target): Same.
+ * emultempl/gld960c.em (gld960_choose_target): Same.
+ * scripttempl/aix.sc: Remove OUTPUT_FORMAT.
+ * emultempl/aix.em (is_syscall): syscall_mask now a variable.
+ * emultempl/aix.em (gld*_read_file): symbol_mode_mask now a variable.
+ * emultempl/aix.em (gld*_parse_args): Handle -b32 -b64 emulation.
+ * emultempl/aix.em (choose_target): New function. Handle emulation of
+ -b32 and -b64.
+
2001-11-27 H.J. Lu <hjl@gnu.org>
* emulparams/elf_i386.sh (NO_SMALL_DATA): Set to yes.
diff --git a/ld/Makefile.in b/ld/Makefile.in
index 95d2c4cd35..1231eb75c0 100644
--- a/ld/Makefile.in
+++ b/ld/Makefile.in
@@ -380,7 +380,6 @@ ALL_64_EMULATIONS = \
emmo.o \
eelf64ppc.o \
eelf64lppc.o \
- eaixppc64.o \
ehppa64linux.o
@@ -1055,9 +1054,6 @@ stringify.sed: ${srcdir}/emultempl/$(STRINGIFY)
ea29k.c: $(srcdir)/emulparams/a29k.sh \
$(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/a29k.sc ${GEN_DEPENDS}
${GENSCRIPTS} a29k "$(tdir_a29k)"
-eaixppc64.c: $(srcdir)/emulparams/aixppc64.sh \
- $(srcdir)/emultempl/aix.em $(srcdir)/scripttempl/aix.sc ${GEN_DEPENDS}
- ${GENSCRIPTS} aixppc64 "$(tdir_aixppc64)"
eaixppc.c: $(srcdir)/emulparams/aixppc.sh \
$(srcdir)/emultempl/aix.em $(srcdir)/scripttempl/aix.sc ${GEN_DEPENDS}
${GENSCRIPTS} aixppc "$(tdir_aixppc)"
diff --git a/ld/configure.tgt b/ld/configure.tgt
index 63d2fb7fe5..a66f77a15b 100644
--- a/ld/configure.tgt
+++ b/ld/configure.tgt
@@ -377,11 +377,7 @@ powerpc-*-netware*) targ_emul=ppcnw ;;
powerpcle-*-pe) targ_emul=ppcpe ;;
powerpcle-*-winnt*) targ_emul=ppcpe ;;
powerpcle-*-cygwin*) targ_emul=ppcpe ;;
-
-powerpc-*-aix*) targ_emul=aixppc
- targ_extra_emuls="aixppc64"
- tdir_aixppc64=${targ_alias}
- ;;
+powerpc-*-aix*) targ_emul=aixppc ;;
powerpc-*-beos*) targ_emul=aixppc ;;
rs6000-*-aix*) targ_emul=aixrs6 ;;
tic30-*-*aout*) targ_emul=tic30aout ;;
diff --git a/ld/emultempl/aix.em b/ld/emultempl/aix.em
index eb01b66ad5..989e5b2843 100644
--- a/ld/emultempl/aix.em
+++ b/ld/emultempl/aix.em
@@ -57,6 +57,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
static void gld${EMULATION_NAME}_before_parse PARAMS ((void));
static int gld${EMULATION_NAME}_parse_args PARAMS ((int, char **));
static void gld${EMULATION_NAME}_after_open PARAMS ((void));
+static char * choose_target PARAMS ((int, char **));
static void gld${EMULATION_NAME}_before_allocation PARAMS ((void));
static void gld${EMULATION_NAME}_read_file PARAMS ((const char *, boolean));
static void gld${EMULATION_NAME}_free PARAMS ((PTR));
@@ -114,6 +115,15 @@ static struct export_symbol_list *export_symbols;
/* Maintains the 32 or 64 bit mode state of import file */
static unsigned int symbol_mode = 0x04;
+/* Which symbol modes are valid */
+static unsigned int symbol_mode_mask = 0x0d;
+
+/* Whether this is a 64 bit link */
+static int is_64bit = 0;
+
+/* Which syscalls from import file are valid */
+static unsigned int syscall_mask = 0x77;
+
/* This routine is called before anything else is done. */
static void
@@ -174,15 +184,12 @@ gld${EMULATION_NAME}_parse_args (argc, argv)
OPTION_PD,
OPTION_PT,
OPTION_STRCMPCT,
- OPTION_UNIX
+ OPTION_UNIX,
+ OPTION_32,
+ OPTION_64,
};
/*
- b64 is an empty option. The native linker uses -b64 for xcoff64 support
- Our linker uses -m aixppc64 for xcoff64 support. The choice for the
- correct emulation is done in collect2.c via the environmental varible
- LDEMULATION.
-
binitfini has special handling in the linker backend. The native linker
uses the arguemnts to generate a table of init and fini functions for
the executable. The important use for this option is to support aix 4.2+
@@ -268,7 +275,8 @@ gld${EMULATION_NAME}_parse_args (argc, argv)
{"bso", no_argument, NULL, OPTION_AUTOIMP},
{"bstrcmpct", no_argument, NULL, OPTION_STRCMPCT},
{"btextro", no_argument, &textro, 1},
- {"b64", no_argument, NULL, 0},
+ {"b32", no_argument, NULL, OPTION_32},
+ {"b64", no_argument, NULL, OPTION_64},
{"static", no_argument, NULL, OPTION_NOAUTOIMP},
{"unix", no_argument, NULL, OPTION_UNIX},
{NULL, no_argument, NULL, 0}
@@ -530,6 +538,19 @@ gld${EMULATION_NAME}_parse_args (argc, argv)
case OPTION_UNIX:
unix_ld = true;
break;
+
+ case OPTION_32:
+ is_64bit = 0;
+ syscall_mask = 0x77;
+ symbol_mode_mask = 0x0d;
+ break;
+
+ case OPTION_64:
+ is_64bit = 1;
+ syscall_mask = 0xcc;
+ symbol_mode_mask = 0x0e;
+ break;
+
}
return 1;
@@ -807,6 +828,42 @@ gld${EMULATION_NAME}_before_allocation ()
}
}
+static char *
+choose_target (argc, argv)
+ int argc;
+ char **argv;
+{
+ int i, j, jmax;
+ static char *from_outside;
+ static char *from_inside;
+ static char *argv_to_target[][2] =
+ {
+ NULL, "aixcoff-rs6000",
+ "-b32", "aixcoff-rs6000",
+ "-b64", "aixcoff64-rs6000",
+ };
+
+ jmax = 3;
+
+ from_outside = getenv (TARGET_ENVIRON);
+ if (from_outside != (char *)NULL)
+ return from_outside;
+
+ /* Set to default. */
+ from_inside = argv_to_target[0][1];
+ for (i = 1; i < argc; i++)
+ {
+ for (j = 1; j < jmax; j++)
+ {
+ if (0 == strcmp (argv[i], argv_to_target[j][0]))
+ from_inside = argv_to_target[j][1];
+ }
+ }
+
+ return from_inside;
+}
+
+
static int change_symbol_mode (char *input)
{
/*
@@ -875,7 +932,7 @@ static int is_syscall(char *input, unsigned int *flag)
}
if (0 == strcmp(input, string)) {
- if (1 << bit & ${SYSCALL_MASK}) {
+ if (1 << bit & syscall_mask) {
*flag = s[bit].flag;
return 1;
} else {
@@ -1035,7 +1092,7 @@ gld${EMULATION_NAME}_read_file (filename, import)
continue;
}
- if (symbol_mode & ${SYMBOL_MODE_MASK})
+ if (symbol_mode & symbol_mode_mask)
{
/* This is a symbol to be imported or exported. */
symname = s;
@@ -1278,7 +1335,7 @@ struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
gld${EMULATION_NAME}_after_open,
after_allocation_default,
set_output_arch_default,
- ldemul_default_target,
+ choose_target,
gld${EMULATION_NAME}_before_allocation,
gld${EMULATION_NAME}_get_script,
"${EMULATION_NAME}",
diff --git a/ld/emultempl/gld960.em b/ld/emultempl/gld960.em
index c61a0619c8..88cfbcc77e 100644
--- a/ld/emultempl/gld960.em
+++ b/ld/emultempl/gld960.em
@@ -40,7 +40,7 @@ the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307
#include "ldemul.h"
static void gld960_before_parse PARAMS ((void));
-static char *gld960_choose_target PARAMS ((void));
+static char *gld960_choose_target PARAMS ((int, char **));
static void gld960_set_output_arch PARAMS ((void));
static char *gld960_get_script PARAMS ((int *));
@@ -90,7 +90,9 @@ gld960_set_output_arch()
}
static char *
-gld960_choose_target()
+gld960_choose_target (argc, argv)
+ int argc ATTRIBUTE_UNUSED;
+ char **argv ATTRIBUTE_UNUSED;
{
#ifdef GNU960
diff --git a/ld/emultempl/gld960c.em b/ld/emultempl/gld960c.em
index 2fdabe900c..0772bcad60 100644
--- a/ld/emultempl/gld960c.em
+++ b/ld/emultempl/gld960c.em
@@ -43,7 +43,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
static void gld960_before_parse PARAMS ((void));
static void gld960_set_output_arch PARAMS ((void));
-static char *gld960_choose_target PARAMS ((void));
+static char *gld960_choose_target PARAMS ((int, char **));
static char *gld960_get_script PARAMS ((int *));
#ifdef GNU960
@@ -105,7 +105,9 @@ gld960_set_output_arch()
}
static char *
-gld960_choose_target()
+gld960_choose_target (argc, argv)
+ int argc ATTRIBUTE_UNUSED;
+ char **argv ATTRIBUTE_UNUSED;
{
#ifdef GNU960
diff --git a/ld/ldemul.c b/ld/ldemul.c
index 44c8c3e7bd..6b96204183 100644
--- a/ld/ldemul.c
+++ b/ld/ldemul.c
@@ -169,15 +169,20 @@ ldemul_recognized_file (entry)
}
char *
-ldemul_choose_target ()
+ldemul_choose_target (argc, argv)
+ int argc;
+ char **argv;
{
- return ld_emulation->choose_target ();
+ return ld_emulation->choose_target (argc, argv);
}
+
/* The default choose_target function. */
char *
-ldemul_default_target ()
+ldemul_default_target (argc, argv)
+ int argc ATTRIBUTE_UNUSED;
+ char **argv ATTRIBUTE_UNUSED;
{
char *from_outside = getenv (TARGET_ENVIRON);
if (from_outside != (char *) NULL)
diff --git a/ld/ldemul.h b/ld/ldemul.h
index 423a9d9552..c49961c15c 100644
--- a/ld/ldemul.h
+++ b/ld/ldemul.h
@@ -25,7 +25,7 @@ extern void ldemul_after_open PARAMS ((void));
extern void ldemul_after_allocation PARAMS ((void));
extern void ldemul_before_allocation PARAMS ((void));
extern void ldemul_set_output_arch PARAMS ((void));
-extern char *ldemul_choose_target PARAMS ((void));
+extern char *ldemul_choose_target PARAMS ((int, char**));
extern void ldemul_choose_mode PARAMS ((char *));
extern void ldemul_list_emulations PARAMS ((FILE *));
extern void ldemul_list_emulation_options PARAMS ((FILE *));
@@ -43,7 +43,7 @@ extern boolean ldemul_recognized_file
extern boolean ldemul_open_dynamic_archive
PARAMS ((const char *, struct search_dirs *,
struct lang_input_statement_struct *));
-extern char *ldemul_default_target PARAMS ((void));
+extern char *ldemul_default_target PARAMS ((int, char**));
extern void after_parse_default PARAMS ((void));
extern void after_open_default PARAMS ((void));
extern void after_allocation_default PARAMS ((void));
@@ -78,7 +78,7 @@ typedef struct ld_emulation_xfer_struct {
void (*set_output_arch) PARAMS ((void));
/* Decide which target name to use. */
- char * (*choose_target) PARAMS ((void));
+ char * (*choose_target) PARAMS ((int, char**));
/* Run before allocating output sections. */
void (*before_allocation) PARAMS ((void));
diff --git a/ld/ldmain.c b/ld/ldmain.c
index 462e16af7d..eacc739153 100644
--- a/ld/ldmain.c
+++ b/ld/ldmain.c
@@ -267,7 +267,7 @@ main (argc, argv)
emulation = get_emulation (argc, argv);
ldemul_choose_mode (emulation);
- default_target = ldemul_choose_target ();
+ default_target = ldemul_choose_target (argc, argv);
lang_init ();
ldemul_before_parse ();
lang_has_input_file = false;
diff --git a/ld/scripttempl/aix.sc b/ld/scripttempl/aix.sc
index 207decdd47..ce67f65105 100644
--- a/ld/scripttempl/aix.sc
+++ b/ld/scripttempl/aix.sc
@@ -2,8 +2,8 @@
# AIX always uses shared libraries. The section VMA appears to be
# unimportant. The native linker aligns the sections on boundaries
# specified by the -H option.
+
cat <<EOF
-OUTPUT_FORMAT("${OUTPUT_FORMAT}")
OUTPUT_ARCH(${ARCH})
${RELOCATING+${LIB_SEARCH_DIRS}}
ENTRY(__start)