mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-09-09 17:02:22 +08:00
* 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.
This commit is contained in:
27
ld/ldexp.c
27
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;
|
||||
|
||||
|
Reference in New Issue
Block a user