diff options
author | Mark Mitchell <mark@codesourcery.com> | 2004-10-26 18:41:52 +0000 |
---|---|---|
committer | Mark Mitchell <mark@codesourcery.com> | 2004-10-26 18:41:52 +0000 |
commit | ba916c8af2642aebace1778a707e90a6a4f9095f (patch) | |
tree | cb164ef2f690eeb1dda279b88015e5e9aa59073d /ld/ldexp.c | |
parent | 1ec5cd372135a64c39eeaa32103cad2913e1754a (diff) | |
download | gdb-ba916c8af2642aebace1778a707e90a6a4f9095f.zip gdb-ba916c8af2642aebace1778a707e90a6a4f9095f.tar.gz gdb-ba916c8af2642aebace1778a707e90a6a4f9095f.tar.bz2 |
* Makefile.in (earmsymbian.c): Depend on armbpabi.sc, not elf.sc.
* ldexp.h (segment_type): New type.
(segments): New variable.
* ldexp.c (segments): New variable.
(exp_print_token): Handle SEGMENT_START.
(fold_binary): Likewise.
* ldgram.y (SEGMENT_START): Declare it as a token.
(exp): Handle SEGMENT_START.
* ldlang.h (lang_address_statement_type): Add segment field.
(lang_section_start): Change prototype.
* ldlang.c (map_input_to_output_sections): Do not process section
assignments if a corresponding SEGMENT_START has already been
seen.
(lang_section_start): Add segment parameter.
* ldlex.l (SEGMENT_START): Add it.
* lexsup.c (seg_segment_start): New function.
(parse_args): Use it for -Tbss, -Tdata, and -Ttext.
* ld.texinfo (SEGMENT_START): Document it.
* emulparams/armsymbian.sh (EMBEDDED): Set it.
* scripttempl/armbpabi.sc: Use SEGMENT_START to control segment
base addresses. Do not map relocations.
* NEWS: Mention SEGMENT_START.
Diffstat (limited to 'ld/ldexp.c')
-rw-r--r-- | ld/ldexp.c | 27 |
1 files changed, 25 insertions, 2 deletions
@@ -48,6 +48,8 @@ static bfd_vma align_n struct exp_data_seg exp_data_seg; +segment_type *segments; + /* Print the string representation of the given token. Surround it with spaces if INFIX_P is TRUE. */ @@ -102,7 +104,8 @@ exp_print_token (token_code_type code, int infix_p) { REL, "relocatable" }, { DATA_SEGMENT_ALIGN, "DATA_SEGMENT_ALIGN" }, { DATA_SEGMENT_RELRO_END, "DATA_SEGMENT_RELRO_END" }, - { DATA_SEGMENT_END, "DATA_SEGMENT_END" } + { DATA_SEGMENT_END, "DATA_SEGMENT_END" }, + { SEGMENT_START, "SEGMENT_START" } }; unsigned int idx; @@ -305,7 +308,27 @@ fold_binary (etree_type *tree, result = exp_fold_tree (tree->binary.lhs, current_section, allocation_done, dot, dotp); - if (result.valid_p) + + /* The SEGMENT_START operator is special because its first + operand is a string, not the name of a symbol. */ + if (result.valid_p && tree->type.node_code == SEGMENT_START) + { + const char *segment_name; + segment_type *seg; + /* Check to see if the user has overridden the default + value. */ + segment_name = tree->binary.rhs->name.name; + for (seg = segments; seg; seg = seg->next) + if (strcmp (seg->name, segment_name) == 0) + { + seg->used = TRUE; + result.value = seg->value; + result.str = NULL; + result.section = NULL; + break; + } + } + else if (result.valid_p) { etree_value_type other; |