From: Ian Lance Taylor Date: Fri, 27 May 1994 15:39:11 +0000 (+0000) Subject: * ldlang.c (entry_symbol): Make static. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=60e8a534070c8dc181b2fb4971b8199597a168f1;p=binutils-gdb.git * ldlang.c (entry_symbol): Make static. (lang_add_entry): Add cmdline argument. * ldlang.h (lang_add_entry): Change prototype. * ldgram.y (statement_anywhere): Change lang_add_entry call. * lexsup.c (parse_args): Likewise. --- diff --git a/ld/ChangeLog b/ld/ChangeLog index 54cea0edddc..70a81a48dd3 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,7 +1,10 @@ Fri May 27 01:08:14 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - * ldlang.c (lang_add_entry): Only set the entry symbol if it has - not been set already. + * ldlang.c (entry_symbol): Make static. + (lang_add_entry): Add cmdline argument. + * ldlang.h (lang_add_entry): Change prototype. + * ldgram.y (statement_anywhere): Change lang_add_entry call. + * lexsup.c (parse_args): Likewise. Tue May 24 16:13:43 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) diff --git a/ld/ldgram.y b/ld/ldgram.y index 0640afee315..4789b7c0d8d 100644 --- a/ld/ldgram.y +++ b/ld/ldgram.y @@ -155,7 +155,6 @@ mri_script_command: einfo("%P%F: unrecognised keyword in MRI style script '%s'\n",$1); } | LIST { - write_map = true; config.map_filename = "-"; } | ORDER ordernamelist @@ -282,7 +281,7 @@ sec_or_group_p1: statement_anywhere: ENTRY '(' NAME ')' - { lang_add_entry($3); } + { lang_add_entry ($3, 0); } | assignment end ; diff --git a/ld/ldlang.c b/ld/ldlang.c index 3ad4ac682ce..b4a38500004 100644 --- a/ld/ldlang.c +++ b/ld/ldlang.c @@ -143,7 +143,7 @@ lang_output_section_statement_type *abs_output_section; lang_statement_list_type *stat_ptr = &statement_list; lang_statement_list_type file_chain = {0}; -CONST char *entry_symbol = 0; +static const char *entry_symbol = 0; boolean lang_has_input_file = false; boolean had_output_filename = false; boolean lang_float_flag = false; @@ -2621,12 +2621,25 @@ lang_section_start (name, address) ad->address = address; } +/* Set the start symbol to NAME. CMDLINE is nonzero if this is called + because of a -e argument on the command line, or zero if this is + called by ENTRY in a linker script. Command line arguments take + precedence. */ + void -lang_add_entry (name) +lang_add_entry (name, cmdline) CONST char *name; + int cmdline; { - if (entry_symbol == NULL) - entry_symbol = name; + static int from_cmdline; + + if (entry_symbol == NULL + || cmdline + || ! from_cmdline) + { + entry_symbol = name; + from_cmdline = cmdline; + } } void diff --git a/ld/ldlang.h b/ld/ldlang.h index 1e7e36a3c73..a3a98e54f14 100644 --- a/ld/ldlang.h +++ b/ld/ldlang.h @@ -64,6 +64,7 @@ typedef struct lang_statement_header_struct lang_object_symbols_statement_enum, lang_fill_statement_enum, lang_data_statement_enum, + lang_reloc_statement_enum, lang_target_statement_enum, lang_output_statement_enum, lang_padding_statement_enum, @@ -148,8 +149,38 @@ typedef struct bfd_vma output_vma; } lang_data_statement_type; +/* Generate a reloc in the output file. */ +typedef struct +{ + lang_statement_header_type header; + + /* Reloc to generate. */ + bfd_reloc_code_real_type reloc; + /* Reloc howto structure. */ + const reloc_howto_type *howto; + + /* Section to generate reloc against. Exactly one of section and + name must be NULL. */ + asection *section; + + /* Name of symbol to generate reloc against. Exactly one of section + and name must be NULL. */ + const char *name; + + /* Expression for addend. */ + union etree_union *addend_exp; + + /* Resolved addend. */ + bfd_vma addend_value; + + /* Output section where reloc should be performed. */ + asection *output_section; + + /* VMA within output section. */ + bfd_vma output_vma; +} lang_reloc_statement_type; typedef struct lang_input_statement_struct { @@ -259,6 +290,7 @@ typedef union lang_statement_union union lang_statement_union *next; lang_wild_statement_type wild_statement; lang_data_statement_type data_statement; + lang_reloc_statement_type reloc_statement; lang_address_statement_type address_statement; lang_output_section_statement_type output_section_statement; lang_afile_asection_pair_statement_type afile_asection_pair_statement; @@ -273,7 +305,6 @@ typedef union lang_statement_union lang_padding_statement_type padding_statement; } lang_statement_union_type; -extern bfd_size_type largest_section; extern lang_output_section_statement_type *abs_output_section; extern boolean lang_has_input_file; extern etree_type *base; @@ -297,7 +328,7 @@ extern void lang_enter_output_section_statement extern void lang_final PARAMS ((void)); extern void lang_process PARAMS ((void)); extern void lang_section_start PARAMS ((const char *, union etree_union *)); -extern void lang_add_entry PARAMS ((const char *)); +extern void lang_add_entry PARAMS ((const char *, int)); extern void lang_add_target PARAMS ((const char *)); extern void lang_add_wild PARAMS ((const char *const , const char *const)); extern void lang_add_map PARAMS ((const char *)); @@ -324,37 +355,6 @@ extern void lang_for_each_file statement != (lang_input_statement_type *)NULL; \ statement = (lang_input_statement_type *)statement->next)\ -#define LANG_FOR_EACH_INPUT_SECTION(statement, abfd, section, x) \ - { \ - extern lang_statement_list_type file_chain; \ - lang_input_statement_type *statement; \ - for (statement = (lang_input_statement_type *)file_chain.head; \ - statement != (lang_input_statement_type *)NULL; \ - statement = (lang_input_statement_type *)statement->next) \ - { \ - asection *section; \ - bfd *abfd = statement->the_bfd; \ - for (section = abfd->sections; \ - section != (asection *)NULL; \ - section = section->next) \ - { \ - x; \ - } \ - } \ - } - -#define LANG_FOR_EACH_OUTPUT_SECTION(section, x) \ - { \ - extern bfd *output_bfd; \ - asection *section; \ - for (section = output_bfd->sections; \ - section != (asection *)NULL; \ - section = section->next) \ - { \ - x; \ - } \ - } - extern void lang_process PARAMS ((void)); extern void ldlang_add_file PARAMS ((lang_input_statement_type *)); extern lang_output_section_statement_type *lang_output_section_find @@ -369,8 +369,16 @@ extern void ldlang_add_undef PARAMS ((const char *const name)); extern void lang_add_output_format PARAMS ((const char *, int from_script)); extern void lang_list_init PARAMS ((lang_statement_list_type*)); extern void lang_add_data PARAMS ((int type, union etree_union *)); +extern void lang_add_reloc + PARAMS ((bfd_reloc_code_real_type reloc, const reloc_howto_type *howto, + asection *section, const char *name, union etree_union *addend)); extern void lang_for_each_statement PARAMS ((void (*func) (lang_statement_union_type *))); extern PTR stat_alloc PARAMS ((size_t size)); +extern bfd_vma lang_size_sections + PARAMS ((lang_statement_union_type *s, + lang_output_section_statement_type *output_section_statement, + lang_statement_union_type **prev, fill_type fill, + bfd_vma dot, boolean relax)); #endif diff --git a/ld/lexsup.c b/ld/lexsup.c index a397574c67b..058f546b09d 100644 --- a/ld/lexsup.c +++ b/ld/lexsup.c @@ -168,7 +168,7 @@ parse_args (argc, argv) be used to select an output format. */ break; case 'e': - lang_add_entry (optarg); + lang_add_entry (optarg, 1); break; case 'F': /* Ignore. */