diff options
author | Alan Modra <amodra@bigpond.net.au> | 2012-06-15 15:13:32 +0000 |
---|---|---|
committer | Alan Modra <amodra@bigpond.net.au> | 2012-06-15 15:13:32 +0000 |
commit | e6ef8cace36b840940fb6d29e715ead89a1d8819 (patch) | |
tree | 24f2404d78990a0bef29ee0dd930592a4e69896d /ld/emultempl | |
parent | 9bad4d1c847c7376fbe536df3ea240f4ad6ac131 (diff) | |
download | binutils-redhat-e6ef8cace36b840940fb6d29e715ead89a1d8819.tar.gz |
ld/
* ldlang.h (lang_output_section_statement_type): Add after_end field.
(lang_abs_symbol_at_beginning_of, lang_abs_symbol_at_end_of): Delete.
(section_for_dot): Declare.
* ldlang.c (lang_size_sections_1): Correct comment.
(current_section): Move earlier.
(current_assign, prefer_next_section): New static vars.
(lang_do_assignments_1): Add found_end param. Detect _end
assignment to set found_end. Set os->after_end. Set above statics.
(lang_do_assignments): Adjust lang_do_assignments_1 call. Init
vars.
(section_for_dot): New function.
(lang_set_startof): Don't make an absolute symbol.
(lang_abs_symbol_at_beginning_of, lang_abs_symbol_at_end_of): Delete.
* ldexp.c (new_rel_from_abs): Use section_for_dot.
* emultempl/lnk960.em (symbol_at_beginning_of): New function.
(symbol_at_end_of): Likewise.
(lnk960_after_allocation): Use them.
* scripttempl/elf.sc: Precede OTHER_GOT_SYMBOLS with . = .; and
likewise before __bss_start.
ld/testsuite/
Update far too many tests.
Diffstat (limited to 'ld/emultempl')
-rw-r--r-- | ld/emultempl/lnk960.em | 66 |
1 files changed, 62 insertions, 4 deletions
diff --git a/ld/emultempl/lnk960.em b/ld/emultempl/lnk960.em index 7120329eda..e556d43235 100644 --- a/ld/emultempl/lnk960.em +++ b/ld/emultempl/lnk960.em @@ -130,15 +130,73 @@ lnk960_after_parse (void) add_on (syslib_list, lang_input_file_is_search_file_enum); } +/* Create a symbol with the given name with the value of the + address of first byte of the section named. + + If the symbol already exists, then do nothing. */ + +static void +symbol_at_beginning_of (const char *secname, const char *name) +{ + struct bfd_link_hash_entry *h; + + h = bfd_link_hash_lookup (link_info.hash, name, TRUE, TRUE, TRUE); + if (h == NULL) + einfo (_("%P%F: bfd_link_hash_lookup failed: %E\n")); + + if (h->type == bfd_link_hash_new + || h->type == bfd_link_hash_undefined) + { + asection *sec; + + h->type = bfd_link_hash_defined; + + sec = bfd_get_section_by_name (link_info.output_bfd, secname); + if (sec == NULL) + sec = bfd_abs_section_ptr; + h->u.def.value = 0; + h->u.def.section = sec; + } +} + +/* Create a symbol with the given name with the value of the + address of the first byte after the end of the section named. + + If the symbol already exists, then do nothing. */ + +static void +symbol_at_end_of (const char *secname, const char *name) +{ + struct bfd_link_hash_entry *h; + + h = bfd_link_hash_lookup (link_info.hash, name, TRUE, TRUE, TRUE); + if (h == NULL) + einfo (_("%P%F: bfd_link_hash_lookup failed: %E\n")); + + if (h->type == bfd_link_hash_new + || h->type == bfd_link_hash_undefined) + { + asection *sec; + + h->type = bfd_link_hash_defined; + + sec = bfd_get_section_by_name (link_info.output_bfd, secname); + if (sec == NULL) + sec = bfd_abs_section_ptr; + h->u.def.value = sec->size; + h->u.def.section = sec; + } +} + static void lnk960_after_allocation (void) { if (!link_info.relocatable) { - lang_abs_symbol_at_end_of (".text", "_etext"); - lang_abs_symbol_at_end_of (".data", "_edata"); - lang_abs_symbol_at_beginning_of (".bss", "_bss_start"); - lang_abs_symbol_at_end_of (".bss", "_end"); + symbol_at_end_of (".text", "_etext"); + symbol_at_end_of (".data", "_edata"); + symbol_at_beginning_of (".bss", "_bss_start"); + symbol_at_end_of (".bss", "_end"); } } |