aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ld/ChangeLog7
-rw-r--r--ld/ldgram.y3
-rw-r--r--ld/ldlang.c21
-rw-r--r--ld/ldlang.h74
-rw-r--r--ld/lexsup.c2
5 files changed, 65 insertions, 42 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog
index 54cea0e..70a81a4 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 0640afe..4789b7c 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 3ad4ac6..b4a3850 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 1e7e36a..a3a98e5 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 a397574..058f546 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. */