aboutsummaryrefslogtreecommitdiff
path: root/ld/ldexp.c
diff options
context:
space:
mode:
authorMark Mitchell <mark@codesourcery.com>2004-10-26 18:41:52 +0000
committerMark Mitchell <mark@codesourcery.com>2004-10-26 18:41:52 +0000
commitba916c8af2642aebace1778a707e90a6a4f9095f (patch)
treecb164ef2f690eeb1dda279b88015e5e9aa59073d /ld/ldexp.c
parent1ec5cd372135a64c39eeaa32103cad2913e1754a (diff)
downloadgdb-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.c27
1 files changed, 25 insertions, 2 deletions
diff --git a/ld/ldexp.c b/ld/ldexp.c
index 57968a2..103b615 100644
--- a/ld/ldexp.c
+++ b/ld/ldexp.c
@@ -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;