* emultempl/aix.em (gld*_before_parse): Set default arch. Reverts

2002-05-10 change.
This commit is contained in:
Alan Modra
2002-08-06 11:40:30 +00:00
parent 86fff92e97
commit 7fc44b9cd6
2 changed files with 74 additions and 60 deletions

View File

@ -1,3 +1,8 @@
2002-08-06 Alan Modra <amodra@bigpond.net.au>
* emultempl/aix.em (gld*_before_parse): Set default arch. Reverts
2002-05-10 change.
2002-08-01 Nick Clifton <nickc@redhat.com> 2002-08-01 Nick Clifton <nickc@redhat.com>
* emulparams/armelf.sh: Revert previous delta. * emulparams/armelf.sh: Revert previous delta.

View File

@ -63,13 +63,13 @@ static char *gld${EMULATION_NAME}_choose_target PARAMS ((int, char **));
static void gld${EMULATION_NAME}_before_allocation PARAMS ((void)); 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}_read_file PARAMS ((const char *, boolean));
static void gld${EMULATION_NAME}_free PARAMS ((PTR)); static void gld${EMULATION_NAME}_free PARAMS ((PTR));
static void gld${EMULATION_NAME}_find_relocs static void gld${EMULATION_NAME}_find_relocs
PARAMS ((lang_statement_union_type *)); PARAMS ((lang_statement_union_type *));
static void gld${EMULATION_NAME}_find_exp_assignment PARAMS ((etree_type *)); static void gld${EMULATION_NAME}_find_exp_assignment PARAMS ((etree_type *));
static char *gld${EMULATION_NAME}_get_script PARAMS ((int *isfile)); static char *gld${EMULATION_NAME}_get_script PARAMS ((int *isfile));
static boolean gld${EMULATION_NAME}_unrecognized_file static boolean gld${EMULATION_NAME}_unrecognized_file
PARAMS ((lang_input_statement_type *)); PARAMS ((lang_input_statement_type *));
static void gld${EMULATION_NAME}_create_output_section_statements static void gld${EMULATION_NAME}_create_output_section_statements
PARAMS ((void)); PARAMS ((void));
static void gld${EMULATION_NAME}_set_output_arch PARAMS ((void)); static void gld${EMULATION_NAME}_set_output_arch PARAMS ((void));
@ -135,7 +135,7 @@ static unsigned int syscall_mask = 0x77;
/* fake file for -binitfini support */ /* fake file for -binitfini support */
static lang_input_statement_type *initfini_file; static lang_input_statement_type *initfini_file;
/* Whether to do run time linking /* Whether to do run time linking
-brtl enables, -bnortl and -bnortllib disable. */ -brtl enables, -bnortl and -bnortllib disable. */
static int rtld; static int rtld;
@ -147,12 +147,21 @@ static char *command_line_blibpath = NULL;
static void static void
gld${EMULATION_NAME}_before_parse () gld${EMULATION_NAME}_before_parse ()
{ {
const bfd_arch_info_type *arch = bfd_scan_arch ("${OUTPUT_ARCH}");
if (arch)
{
ldfile_output_architecture = arch->arch;
ldfile_output_machine = arch->mach;
ldfile_output_machine_name = arch->printable_name;
}
else
ldfile_output_architecture = bfd_arch_`echo ${ARCH} | sed -e 's/:.*//'`;
config.has_shared = true; config.has_shared = true;
/* The link_info.[init|fini]_functions are initialized in ld/lexsup.c. /* The link_info.[init|fini]_functions are initialized in ld/lexsup.c.
Override them here so we can use the link_info.init_function as a Override them here so we can use the link_info.init_function as a
state flag that lets the backend know that -binitfini has been done. */ state flag that lets the backend know that -binitfini has been done. */
link_info.init_function = NULL; link_info.init_function = NULL;
link_info.fini_function = NULL; link_info.fini_function = NULL;
@ -173,7 +182,7 @@ gld${EMULATION_NAME}_parse_args (argc, argv)
bfd_signed_vma val; bfd_signed_vma val;
char *end; char *end;
enum enum
{ {
OPTION_IGNORE = 300, OPTION_IGNORE = 300,
OPTION_AUTOIMP, OPTION_AUTOIMP,
@ -202,7 +211,7 @@ gld${EMULATION_NAME}_parse_args (argc, argv)
uses the arguemnts to generate a table of init and fini functions for 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+ the executable. The important use for this option is to support aix 4.2+
c++ constructors and destructors. This is tied into gcc via collect2.c. c++ constructors and destructors. This is tied into gcc via collect2.c.
The function table is accessed by the runtime linker/loader by checking if The function table is accessed by the runtime linker/loader by checking if
the first symbol in the loader symbol table is __rtinit. The gnu linker the first symbol in the loader symbol table is __rtinit. The gnu linker
generates this symbol and makes it the first loader symbol. */ generates this symbol and makes it the first loader symbol. */
@ -333,9 +342,9 @@ gld${EMULATION_NAME}_parse_args (argc, argv)
case 'T': case 'T':
/* On AIX this is the same as GNU ld -Ttext. When we see -T /* On AIX this is the same as GNU ld -Ttext. When we see -T
number, we assume the AIX option is intended. Otherwise, we number, we assume the AIX option is intended. Otherwise, we
assume the usual GNU ld -T option is intended. We can't just assume the usual GNU ld -T option is intended. We can't just
ignore the AIX option, because gcc passes it to the linker. */ ignore the AIX option, because gcc passes it to the linker. */
val = strtoull (optarg, &end, 0); val = strtoull (optarg, &end, 0);
if (*end != '\0') if (*end != '\0')
{ {
@ -384,7 +393,7 @@ gld${EMULATION_NAME}_parse_args (argc, argv)
link_info.fini_function = f; link_info.fini_function = f;
} }
break; break;
case OPTION_AUTOIMP: case OPTION_AUTOIMP:
link_info.static_link = false; link_info.static_link = false;
break; break;
@ -431,7 +440,7 @@ gld${EMULATION_NAME}_parse_args (argc, argv)
case OPTION_MAXSTACK: case OPTION_MAXSTACK:
val = strtoull (optarg, &end, 0); val = strtoull (optarg, &end, 0);
if (*end != '\0') if (*end != '\0')
einfo ("%P: warning: ignoring invalid -bmaxstack number %s\n", einfo ("%P: warning: ignoring invalid -bmaxstack number %s\n",
optarg); optarg);
else else
maxstack = val; maxstack = val;
@ -459,9 +468,9 @@ gld${EMULATION_NAME}_parse_args (argc, argv)
case OPTION_PD: case OPTION_PD:
/* This sets the page that the .data section is supposed to /* This sets the page that the .data section is supposed to
start on. The offset within the page should still be the start on. The offset within the page should still be the
offset within the file, so we need to build an appropriate offset within the file, so we need to build an appropriate
expression. */ expression. */
val = strtoull (optarg, &end, 0); val = strtoull (optarg, &end, 0);
if (*end != '\0') if (*end != '\0')
einfo ("%P: warning: ignoring invalid -pD number %s\n", optarg); einfo ("%P: warning: ignoring invalid -pD number %s\n", optarg);
@ -483,8 +492,8 @@ gld${EMULATION_NAME}_parse_args (argc, argv)
case OPTION_PT: case OPTION_PT:
/* This set the page that the .text section is supposed to start /* This set the page that the .text section is supposed to start
on. The offset within the page should still be the offset on. The offset within the page should still be the offset
within the file. */ within the file. */
val = strtoull (optarg, &end, 0); val = strtoull (optarg, &end, 0);
if (*end != '\0') if (*end != '\0')
einfo ("%P: warning: ignoring invalid -pT number %s\n", optarg); einfo ("%P: warning: ignoring invalid -pT number %s\n", optarg);
@ -600,8 +609,8 @@ gld${EMULATION_NAME}_after_open ()
bfd_size_type size; bfd_size_type size;
/* If the symbol is defined, we may have been invoked from /* If the symbol is defined, we may have been invoked from
collect, and the sets may already have been built, so we do collect, and the sets may already have been built, so we do
not do anything. */ not do anything. */
if (p->h->type == bfd_link_hash_defined if (p->h->type == bfd_link_hash_defined
|| p->h->type == bfd_link_hash_defweak) || p->h->type == bfd_link_hash_defweak)
continue; continue;
@ -651,9 +660,9 @@ gld${EMULATION_NAME}_before_allocation ()
lang_for_each_statement (gld${EMULATION_NAME}_find_relocs); lang_for_each_statement (gld${EMULATION_NAME}_find_relocs);
/* Precedence of LIBPATH /* Precedence of LIBPATH
-blibpath: native support always first -blibpath: native support always first
-rpath: gnu extension -rpath: gnu extension
-L build from command line -L's */ -L build from command line -L's */
if (command_line_blibpath != NULL) if (command_line_blibpath != NULL)
libpath = command_line_blibpath; libpath = command_line_blibpath;
else if (command_line.rpath != NULL) else if (command_line.rpath != NULL)
@ -681,10 +690,10 @@ gld${EMULATION_NAME}_before_allocation ()
} }
/* Let the XCOFF backend set up the .loader section. */ /* Let the XCOFF backend set up the .loader section. */
if (!bfd_xcoff_size_dynamic_sections if (!bfd_xcoff_size_dynamic_sections
(output_bfd, &link_info, libpath, entry_symbol.name, file_align, (output_bfd, &link_info, libpath, entry_symbol.name, file_align,
maxstack, maxdata, gc && !unix_ld ? true : false, maxstack, maxdata, gc && !unix_ld ? true : false,
modtype, textro ? true : false, unix_ld, special_sections, modtype, textro ? true : false, unix_ld, special_sections,
rtld ? true : false)) rtld ? true : false))
einfo ("%P%F: failed to set dynamic section sizes: %E\n"); einfo ("%P%F: failed to set dynamic section sizes: %E\n");
@ -704,16 +713,16 @@ gld${EMULATION_NAME}_before_allocation ()
continue; continue;
/* Remove this section from the list of the output section. /* Remove this section from the list of the output section.
This assumes we know what the script looks like. */ This assumes we know what the script looks like. */
is = NULL; is = NULL;
os = lang_output_section_find (sec->output_section->name); os = lang_output_section_find (sec->output_section->name);
if (os == NULL) if (os == NULL)
einfo ("%P%F: can't find output section %s\n", einfo ("%P%F: can't find output section %s\n",
sec->output_section->name); sec->output_section->name);
for (pls = &os->children.head; *pls != NULL; pls = &(*pls)->header.next) for (pls = &os->children.head; *pls != NULL; pls = &(*pls)->header.next)
{ {
if ((*pls)->header.type == lang_input_section_enum if ((*pls)->header.type == lang_input_section_enum
&& (*pls)->input_section.section == sec) && (*pls)->input_section.section == sec)
{ {
is = (lang_input_section_type *) * pls; is = (lang_input_section_type *) * pls;
@ -729,7 +738,7 @@ gld${EMULATION_NAME}_before_allocation ()
*pwls != NULL; pwls = &(*pwls)->header.next) *pwls != NULL; pwls = &(*pwls)->header.next)
{ {
if ((*pwls)->header.type == lang_input_section_enum if ((*pwls)->header.type == lang_input_section_enum
&& (*pwls)->input_section.section == sec) && (*pwls)->input_section.section == sec)
{ {
is = (lang_input_section_type *) * pwls; is = (lang_input_section_type *) * pwls;
@ -811,7 +820,7 @@ gld${EMULATION_NAME}_choose_target (argc, argv)
int i, j, jmax; int i, j, jmax;
static char *from_outside; static char *from_outside;
static char *from_inside; static char *from_inside;
static char *argv_to_target[][2] = { static char *argv_to_target[][2] = {
{NULL, "${OUTPUT_FORMAT}"}, {NULL, "${OUTPUT_FORMAT}"},
{"-b32", "${OUTPUT_FORMAT_32BIT}"}, {"-b32", "${OUTPUT_FORMAT_32BIT}"},
{"-b64", "${OUTPUT_FORMAT_64BIT}"}, {"-b64", "${OUTPUT_FORMAT_64BIT}"},
@ -827,7 +836,7 @@ gld${EMULATION_NAME}_choose_target (argc, argv)
from_inside = argv_to_target[0][1]; from_inside = argv_to_target[0][1];
for (i = 1; i < argc; i++) for (i = 1; i < argc; i++)
{ {
for (j = 1; j < jmax; j++) for (j = 1; j < jmax; j++)
{ {
if (0 == strcmp (argv[i], argv_to_target[j][0])) if (0 == strcmp (argv[i], argv_to_target[j][0]))
from_inside = argv_to_target[j][1]; from_inside = argv_to_target[j][1];
@ -837,10 +846,10 @@ gld${EMULATION_NAME}_choose_target (argc, argv)
return from_inside; return from_inside;
} }
/* Returns /* Returns
1 : state changed 1 : state changed
0 : no change */ 0 : no change */
static int static int
change_symbol_mode (input) change_symbol_mode (input)
char *input; char *input;
{ {
@ -871,18 +880,18 @@ change_symbol_mode (input)
return 0; return 0;
} }
/* Returns /* Returns
1 : yes 1 : yes
0 : ignore 0 : ignore
-1 : error, try something else */ -1 : error, try something else */
static int static int
is_syscall (input, flag) is_syscall (input, flag)
char *input; char *input;
unsigned int *flag; unsigned int *flag;
{ {
unsigned int bit; unsigned int bit;
char *string; char *string;
struct sc { struct sc {
char *syscall_string; char *syscall_string;
unsigned int flag; unsigned int flag;
@ -900,20 +909,20 @@ is_syscall (input, flag)
*flag = 0; *flag = 0;
for (bit = 0;; bit++) for (bit = 0;; bit++)
{ {
string = s[bit].syscall_string; string = s[bit].syscall_string;
if (string == NULL) if (string == NULL)
return -1; return -1;
if (0 == strcmp (input, string)) if (0 == strcmp (input, string))
{ {
if (1 << bit & syscall_mask) if (1 << bit & syscall_mask)
{ {
*flag = s[bit].flag; *flag = s[bit].flag;
return 1; return 1;
} }
else else
{ {
return 0; return 0;
} }
@ -1106,8 +1115,8 @@ gld${EMULATION_NAME}_read_file (filename, import)
char *end; char *end;
status = is_syscall (s, &syscall_flag); status = is_syscall (s, &syscall_flag);
if (0 > status) if (0 > status)
{ {
/* not a system call, check for address */ /* not a system call, check for address */
address = strtoul (s, &end, 0); address = strtoul (s, &end, 0);
@ -1115,7 +1124,7 @@ gld${EMULATION_NAME}_read_file (filename, import)
{ {
einfo ("%s:%d: warning: syntax error in import/export file\n", einfo ("%s:%d: warning: syntax error in import/export file\n",
filename, lineno); filename, lineno);
} }
} }
} }
@ -1266,16 +1275,16 @@ cat >>e${EMULATION_NAME}.c <<EOF
if (link_info.relocateable == true && config.build_constructors == true) if (link_info.relocateable == true && config.build_constructors == true)
return return
EOF EOF
sed $sc ldscripts/${EMULATION_NAME}.xu >> e${EMULATION_NAME}.c sed $sc ldscripts/${EMULATION_NAME}.xu >> e${EMULATION_NAME}.c
echo ' ; else if (link_info.relocateable == true) return' >> e${EMULATION_NAME}.c echo ' ; else if (link_info.relocateable == true) return' >> e${EMULATION_NAME}.c
sed $sc ldscripts/${EMULATION_NAME}.xr >> e${EMULATION_NAME}.c sed $sc ldscripts/${EMULATION_NAME}.xr >> e${EMULATION_NAME}.c
echo ' ; else if (!config.text_read_only) return' >> e${EMULATION_NAME}.c echo ' ; else if (!config.text_read_only) return' >> e${EMULATION_NAME}.c
sed $sc ldscripts/${EMULATION_NAME}.xbn >> e${EMULATION_NAME}.c sed $sc ldscripts/${EMULATION_NAME}.xbn >> e${EMULATION_NAME}.c
echo ' ; else if (!config.magic_demand_paged) return' >> e${EMULATION_NAME}.c echo ' ; else if (!config.magic_demand_paged) return' >> e${EMULATION_NAME}.c
sed $sc ldscripts/${EMULATION_NAME}.xn >> e${EMULATION_NAME}.c sed $sc ldscripts/${EMULATION_NAME}.xn >> e${EMULATION_NAME}.c
echo ' ; else return' >> e${EMULATION_NAME}.c echo ' ; else return' >> e${EMULATION_NAME}.c
sed $sc ldscripts/${EMULATION_NAME}.x >> e${EMULATION_NAME}.c sed $sc ldscripts/${EMULATION_NAME}.x >> e${EMULATION_NAME}.c
echo '; }' >> e${EMULATION_NAME}.c echo '; }' >> e${EMULATION_NAME}.c
else else
# Scripts read from the filesystem. # Scripts read from the filesystem.
@ -1301,19 +1310,19 @@ fi
cat >>e${EMULATION_NAME}.c <<EOF cat >>e${EMULATION_NAME}.c <<EOF
static void static void
gld${EMULATION_NAME}_create_output_section_statements () gld${EMULATION_NAME}_create_output_section_statements ()
{ {
/* __rtinit */ /* __rtinit */
if ((bfd_get_flavour (output_bfd) == bfd_target_xcoff_flavour) if ((bfd_get_flavour (output_bfd) == bfd_target_xcoff_flavour)
&& (link_info.init_function != NULL && (link_info.init_function != NULL
|| link_info.fini_function != NULL || link_info.fini_function != NULL
|| rtld == true)) || rtld == true))
{ {
initfini_file = lang_add_input_file ("initfini", initfini_file = lang_add_input_file ("initfini",
lang_input_file_is_file_enum, lang_input_file_is_file_enum,
NULL); NULL);
initfini_file->the_bfd = bfd_create ("initfini", output_bfd); initfini_file->the_bfd = bfd_create ("initfini", output_bfd);
if (initfini_file->the_bfd == NULL if (initfini_file->the_bfd == NULL
|| ! bfd_set_arch_mach (initfini_file->the_bfd, || ! bfd_set_arch_mach (initfini_file->the_bfd,
@ -1323,10 +1332,10 @@ gld${EMULATION_NAME}_create_output_section_statements ()
einfo ("%X%P: can not create BFD %E\n"); einfo ("%X%P: can not create BFD %E\n");
return; return;
} }
/* Call backend to fill in the rest */ /* Call backend to fill in the rest */
if (false == bfd_xcoff_link_generate_rtinit (initfini_file->the_bfd, if (false == bfd_xcoff_link_generate_rtinit (initfini_file->the_bfd,
link_info.init_function, link_info.init_function,
link_info.fini_function, link_info.fini_function,
rtld)) rtld))
{ {
@ -1335,7 +1344,7 @@ gld${EMULATION_NAME}_create_output_section_statements ()
} }
/* __rtld defined in /lib/librtl.a */ /* __rtld defined in /lib/librtl.a */
if (true == rtld) if (true == rtld)
lang_add_input_file ("rtl", lang_input_file_is_l_enum, NULL); lang_add_input_file ("rtl", lang_input_file_is_l_enum, NULL);
} }
} }