binutils-gdb/ld/emultempl/sparcelf.em

154 lines
3.9 KiB
Plaintext

# This shell script emits a C file. -*- C -*-
#
LDEMUL_GET_SCRIPT=${EMULATION_NAME}_get_script
LDEMUL_AFTER_PARSE=${EMULATION_NAME}_after_parse
LDEMUL_RECOGNIZED_FILE=${EMULATION_NAME}_recognized_file
LDEMUL_ALLOW_DYNAMIC_ENTRIES_IN_RELOCATABLE_LINK=\
${EMULATION_NAME}_allow_dynamic_entries_in_relocatable_link
fragment <<EOF
#include "elfxx-sparc.h"
static int link_mixed_eir = 0;
static bfd_boolean mark_objects;
static bfd_boolean inside_marked_objects;
static bfd_boolean ignore_pure_eir_files;
static char * gld${EMULATION_NAME}_get_script (int *);
static char *
${LDEMUL_GET_SCRIPT} (int *isfile)
{
if (link_mixed_eir == 2)
{
*isfile = 0;
return ("SECTIONS\n"
"{\n"
"\t.pack_pure_eir : { *(.pack_pure_eir) }\n"
"\t.pack_mixed_eir : { *(.pack_mixed_eir) }\n"
"\t/DISCARD/ : { *(*) }\n"
"}\n");
}
return gld${EMULATION_NAME}_get_script (isfile);
}
static void
${LDEMUL_AFTER_PARSE} (void)
{
_bfd_sparc_elf_after_parse (link_mixed_eir);
gld${EMULATION_NAME}_after_parse ();
}
static bfd_boolean gld${EMULATION_NAME}_load_symbols
(lang_input_statement_type *);
static bfd_boolean
pure_eir_finder (bfd *abfd ATTRIBUTE_UNUSED,
asection *section,
void *ptr ATTRIBUTE_UNUSED)
{
return strcmp (section->name, ".pack_pure_eir") == 0;
}
static bfd_boolean
${LDEMUL_RECOGNIZED_FILE} (lang_input_statement_type *entry)
{
if (link_mixed_eir != 0 && (entry->the_bfd->flags & DYNAMIC) != 0)
return TRUE;
if (ignore_pure_eir_files
&& bfd_sections_find_if (entry->the_bfd, pure_eir_finder, NULL))
return TRUE;
/* Otherwise, the standard implementation from 'elf32.em' will do. */
return gld${EMULATION_NAME}_load_symbols (entry);
}
static bfd_boolean
${LDEMUL_ALLOW_DYNAMIC_ENTRIES_IN_RELOCATABLE_LINK} (void)
{
if (link_mixed_eir != 0)
return TRUE;
return FALSE;
}
EOF
PARSE_AND_LIST_PROLOGUE='
#define OPTION_LINK_MIXED_EIR 301
#define OPTION_BINARY_EIR_OUTPUT 302
#define OPTION_MARK_REGULAR_OBJECTS 303
#define OPTION_START_REGULAR_OBJECTS 304
#define OPTION_END_REGULAR_OBJECTS 305
#define OPTION_IGNORE_PURE_EIR_FILES 306
'
PARSE_AND_LIST_LONGOPTS='
{ "link-mixed-eir", required_argument, NULL, OPTION_LINK_MIXED_EIR },
{ "binary-eir-output", no_argument, NULL, OPTION_BINARY_EIR_OUTPUT},
{ "mark-regular-objects", no_argument, NULL, OPTION_MARK_REGULAR_OBJECTS},
{ "start-regular-objects", no_argument, NULL, OPTION_START_REGULAR_OBJECTS},
{ "end-regular-objects", no_argument, NULL, OPTION_END_REGULAR_OBJECTS},
{ "ignore-pure-eir-files", no_argument, NULL, OPTION_IGNORE_PURE_EIR_FILES},
'
PARSE_AND_LIST_OPTIONS='
fprintf (file, _(" --link-mixed-eir={1,2,3}\n"));
fprintf (file, _("\t\t\tLink mixed EIR\n"));
'
PARSE_AND_LIST_ARGS_CASES='
case OPTION_LINK_MIXED_EIR:
if ((optarg[0] != '\''1'\'' && optarg[0] != '\''2'\'' && optarg[0] != '\''3'\'')
|| optarg[1] != '\''\0'\'')
einfo (_("%P%F: invalid value for `--link-mixed-eir'\'' option: '\''%s'\''\n"), optarg);
link_mixed_eir = optarg[0] - '\''0'\'';
break;
case OPTION_BINARY_EIR_OUTPUT:
break;
case OPTION_MARK_REGULAR_OBJECTS:
mark_objects = TRUE;
break;
case OPTION_START_REGULAR_OBJECTS:
inside_marked_objects = TRUE;
break;
case OPTION_END_REGULAR_OBJECTS:
inside_marked_objects = FALSE;
break;
case OPTION_IGNORE_PURE_EIR_FILES:
ignore_pure_eir_files = TRUE;
break;
case 1:
if (!mark_objects || inside_marked_objects)
return FALSE;
{
bfd_boolean ret = FALSE;
bfd *abfd = bfd_openr (optarg, "default");
if (abfd == NULL)
return FALSE;
if (bfd_check_format (abfd, bfd_object))
ret = TRUE;
bfd_close (abfd);
return ret;
}
break;
'