bfd/
* elflink.c (bfd_elf_record_link_assignment): Remove --defsym symbols special case. ld/ * ldexp.h (etree_union): Add defsym member to the assign member structure. (exp_assign): Add hidden argument to prototype. * ldexp.c (exp_fold_tree_1): Use the defsym member to handle --defsym symbols. (exp_assop): Add defsym argument, initialize the defsym member of the assign structure. (exp_assign): Handle hidden symbols. (exp_defsym): Update to use the defsym argument to exp_assop. (exp_provide): Update to handle the defsym argument to exp_assop. * ldlex.l (HIDDEN): New token. * ldgram.y (HIDDEN): Likewise. (assignment, section): Update calls to exp_assign. * ldctor.c (ldctor_build_sets): Likewise. * mri.c (mri_format): Likewise. * ldlang.c (lang_insert_orphan, lang_leave_overlay): Likewise. (open_input_bfds): Remove --defsym symbols special case. * emultempl/beos.em (gld_${EMULATION_NAME}_set_symbols): Update call to exp_assign. * emultempl/pe.em (gld_${EMULATION_NAME}_set_symbols): Likewise. * emultempl/pep.em (gld_${EMULATION_NAME}_set_symbols): Likewise. * emultempl/spuelf.em (spu_place_special_section): Likewise. * emultempl/xtensaelf.em (ld_xtensa_insert_page_offsets): Likewise. * ld.texinfo (Assigning Values to Symbols): Add HIDDEN. (HIDDEN): New subsection.
This commit is contained in:
parent
de88229846
commit
eb8476a6e2
16 changed files with 102 additions and 25 deletions
|
@ -1,3 +1,8 @@
|
|||
2012-08-06 Maciej W. Rozycki <macro@codesourcery.com>
|
||||
|
||||
* elflink.c (bfd_elf_record_link_assignment): Remove --defsym
|
||||
symbols special case.
|
||||
|
||||
2012-08-05 Maciej W. Rozycki <macro@linux-mips.org>
|
||||
|
||||
* elf32-vax.c (elf_vax_adjust_dynamic_symbol): Don't allocate
|
||||
|
|
|
@ -569,7 +569,7 @@ bfd_elf_record_link_assignment (bfd *output_bfd,
|
|||
|
||||
h->def_regular = 1;
|
||||
|
||||
if (provide && hidden)
|
||||
if (hidden)
|
||||
{
|
||||
bed = get_elf_backend_data (output_bfd);
|
||||
h->other = (h->other & ~ELF_ST_VISIBILITY (-1)) | STV_HIDDEN;
|
||||
|
|
29
ld/ChangeLog
29
ld/ChangeLog
|
@ -1,3 +1,32 @@
|
|||
2012-08-06 Maciej W. Rozycki <macro@codesourcery.com>
|
||||
|
||||
* ldexp.h (etree_union): Add defsym member to the assign member
|
||||
structure.
|
||||
(exp_assign): Add hidden argument to prototype.
|
||||
* ldexp.c (exp_fold_tree_1): Use the defsym member to handle
|
||||
--defsym symbols.
|
||||
(exp_assop): Add defsym argument, initialize the defsym member
|
||||
of the assign structure.
|
||||
(exp_assign): Handle hidden symbols.
|
||||
(exp_defsym): Update to use the defsym argument to exp_assop.
|
||||
(exp_provide): Update to handle the defsym argument to exp_assop.
|
||||
* ldlex.l (HIDDEN): New token.
|
||||
* ldgram.y (HIDDEN): Likewise.
|
||||
(assignment, section): Update calls to exp_assign.
|
||||
* ldctor.c (ldctor_build_sets): Likewise.
|
||||
* mri.c (mri_format): Likewise.
|
||||
* ldlang.c (lang_insert_orphan, lang_leave_overlay): Likewise.
|
||||
(open_input_bfds): Remove --defsym symbols special case.
|
||||
* emultempl/beos.em (gld_${EMULATION_NAME}_set_symbols): Update
|
||||
call to exp_assign.
|
||||
* emultempl/pe.em (gld_${EMULATION_NAME}_set_symbols): Likewise.
|
||||
* emultempl/pep.em (gld_${EMULATION_NAME}_set_symbols): Likewise.
|
||||
* emultempl/spuelf.em (spu_place_special_section): Likewise.
|
||||
* emultempl/xtensaelf.em (ld_xtensa_insert_page_offsets):
|
||||
Likewise.
|
||||
* ld.texinfo (Assigning Values to Symbols): Add HIDDEN.
|
||||
(HIDDEN): New subsection.
|
||||
|
||||
2012-07-31 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
PR ld/14156
|
||||
|
|
|
@ -348,7 +348,8 @@ gld_${EMULATION_NAME}_set_symbols (void)
|
|||
for (j = 0; init[j].ptr; j++)
|
||||
{
|
||||
long val = init[j].value;
|
||||
lang_add_assignment (exp_assign (init[j].symbol, exp_intop (val)));
|
||||
lang_add_assignment (exp_assign (init[j].symbol, exp_intop (val),
|
||||
FALSE));
|
||||
if (init[j].size == sizeof(short))
|
||||
*(short *)init[j].ptr = val;
|
||||
else if (init[j].size == sizeof(int))
|
||||
|
|
|
@ -944,7 +944,7 @@ gld_${EMULATION_NAME}_set_symbols (void)
|
|||
lang_assignment_statement_type *rv;
|
||||
|
||||
rv = lang_add_assignment (exp_assign (GET_INIT_SYMBOL_NAME (j),
|
||||
exp_intop (val)));
|
||||
exp_intop (val), FALSE));
|
||||
if (init[j].size == sizeof (short))
|
||||
*(short *) init[j].ptr = val;
|
||||
else if (init[j].size == sizeof (int))
|
||||
|
@ -1721,8 +1721,9 @@ gld_${EMULATION_NAME}_unrecognized_file (lang_input_statement_type *entry ATTRIB
|
|||
= pe_def_file->base_address;
|
||||
init[IMAGEBASEOFF].inited = 1;
|
||||
if (image_base_statement)
|
||||
image_base_statement->exp = exp_assign ("__image_base__",
|
||||
exp_intop (pe.ImageBase));
|
||||
image_base_statement->exp
|
||||
= exp_assign ("__image_base__", exp_intop (pe.ImageBase),
|
||||
FALSE);
|
||||
}
|
||||
|
||||
if (pe_def_file->stack_reserve != -1
|
||||
|
|
|
@ -856,7 +856,7 @@ gld_${EMULATION_NAME}_set_symbols (void)
|
|||
lang_assignment_statement_type *rv;
|
||||
|
||||
rv = lang_add_assignment (exp_assign (GET_INIT_SYMBOL_NAME (j),
|
||||
exp_intop (val)));
|
||||
exp_intop (val), FALSE));
|
||||
if (init[j].size == sizeof (short))
|
||||
*(short *) init[j].ptr = (short) val;
|
||||
else if (init[j].size == sizeof (int))
|
||||
|
@ -1522,8 +1522,9 @@ gld_${EMULATION_NAME}_unrecognized_file (lang_input_statement_type *entry ATTRIB
|
|||
= pep_def_file->base_address;
|
||||
init[IMAGEBASEOFF].inited = 1;
|
||||
if (image_base_statement)
|
||||
image_base_statement->exp = exp_assign ("__image_base__",
|
||||
exp_intop (pep.ImageBase));
|
||||
image_base_statement->exp
|
||||
= exp_assign ("__image_base__", exp_intop (pep.ImageBase),
|
||||
FALSE);
|
||||
}
|
||||
|
||||
if (pep_def_file->stack_reserve != -1
|
||||
|
|
|
@ -165,7 +165,7 @@ spu_place_special_section (asection *s, asection *o, const char *output_name)
|
|||
|
||||
push_stat_ptr (&os->children);
|
||||
e_size = exp_intop (params.line_size - s->size);
|
||||
lang_add_assignment (exp_assign (".", e_size));
|
||||
lang_add_assignment (exp_assign (".", e_size, FALSE));
|
||||
pop_stat_ptr ();
|
||||
}
|
||||
lang_add_section (&os->children, s, NULL, os);
|
||||
|
|
|
@ -1887,7 +1887,7 @@ ld_xtensa_insert_page_offsets (bfd_vma dot,
|
|||
etree_type *name_op = exp_nameop (NAME, ".");
|
||||
etree_type *addend_op = exp_intop (1 << xtensa_page_power);
|
||||
etree_type *add_op = exp_binop ('+', name_op, addend_op);
|
||||
etree_type *assign_op = exp_assign (".", add_op);
|
||||
etree_type *assign_op = exp_assign (".", add_op, FALSE);
|
||||
|
||||
lang_assignment_statement_type *assign_stmt;
|
||||
lang_statement_union_type *assign_union;
|
||||
|
|
|
@ -3410,6 +3410,7 @@ the symbol and place it into the symbol table with a global scope.
|
|||
|
||||
@menu
|
||||
* Simple Assignments:: Simple Assignments
|
||||
* HIDDEN:: HIDDEN
|
||||
* PROVIDE:: PROVIDE
|
||||
* PROVIDE_HIDDEN:: PROVIDE_HIDDEN
|
||||
* Source Code Reference:: How to use a linker script defined symbol in source code
|
||||
|
@ -3473,6 +3474,31 @@ the last @samp{.text} input section. The symbol @samp{_bdata} will be
|
|||
defined as the address following the @samp{.text} output section aligned
|
||||
upward to a 4 byte boundary.
|
||||
|
||||
@node HIDDEN
|
||||
@subsection HIDDEN
|
||||
@cindex HIDDEN
|
||||
For ELF targeted ports, define a symbol that will be hidden and won't be
|
||||
exported. The syntax is @code{HIDDEN(@var{symbol} = @var{expression})}.
|
||||
|
||||
Here is the example from @ref{Simple Assignments}, rewritten to use
|
||||
@code{HIDDEN}:
|
||||
|
||||
@smallexample
|
||||
HIDDEN(floating_point = 0);
|
||||
SECTIONS
|
||||
@{
|
||||
.text :
|
||||
@{
|
||||
*(.text)
|
||||
HIDDEN(_etext = .);
|
||||
@}
|
||||
HIDDEN(_bdata = (. + 3) & ~ 3);
|
||||
.data : @{ *(.data) @}
|
||||
@}
|
||||
@end smallexample
|
||||
@noindent
|
||||
In this case none of the three symbols will be visible outside this module.
|
||||
|
||||
@node PROVIDE
|
||||
@subsection PROVIDE
|
||||
@cindex PROVIDE
|
||||
|
|
|
@ -321,9 +321,11 @@ ldctor_build_sets (void)
|
|||
|
||||
lang_add_assignment (exp_assign (".",
|
||||
exp_unop (ALIGN_K,
|
||||
exp_intop (reloc_size))));
|
||||
exp_intop (reloc_size)),
|
||||
FALSE));
|
||||
lang_add_assignment (exp_assign (p->h->root.string,
|
||||
exp_nameop (NAME, ".")));
|
||||
exp_nameop (NAME, "."),
|
||||
FALSE));
|
||||
lang_add_data (size, exp_intop (p->count));
|
||||
|
||||
for (e = p->elements; e != NULL; e = e->next)
|
||||
|
|
16
ld/ldexp.c
16
ld/ldexp.c
|
@ -892,7 +892,7 @@ exp_fold_tree_1 (etree_type *tree)
|
|||
if (expld.result.valid_p
|
||||
|| (expld.phase <= lang_mark_phase_enum
|
||||
&& tree->type.node_class == etree_assign
|
||||
&& tree->assign.hidden))
|
||||
&& tree->assign.defsym))
|
||||
{
|
||||
if (h == NULL)
|
||||
{
|
||||
|
@ -1054,6 +1054,7 @@ static etree_type *
|
|||
exp_assop (const char *dst,
|
||||
etree_type *src,
|
||||
enum node_tree_enum class,
|
||||
bfd_boolean defsym,
|
||||
bfd_boolean hidden)
|
||||
{
|
||||
etree_type *n;
|
||||
|
@ -1065,20 +1066,25 @@ exp_assop (const char *dst,
|
|||
n->assign.type.node_class = class;
|
||||
n->assign.src = src;
|
||||
n->assign.dst = dst;
|
||||
n->assign.defsym = defsym;
|
||||
n->assign.hidden = hidden;
|
||||
return n;
|
||||
}
|
||||
|
||||
/* Handle linker script assignments and HIDDEN. */
|
||||
|
||||
etree_type *
|
||||
exp_assign (const char *dst, etree_type *src)
|
||||
exp_assign (const char *dst, etree_type *src, bfd_boolean hidden)
|
||||
{
|
||||
return exp_assop (dst, src, etree_assign, FALSE);
|
||||
return exp_assop (dst, src, etree_assign, FALSE, hidden);
|
||||
}
|
||||
|
||||
/* Handle --defsym command-line option. */
|
||||
|
||||
etree_type *
|
||||
exp_defsym (const char *dst, etree_type *src)
|
||||
{
|
||||
return exp_assop (dst, src, etree_assign, TRUE);
|
||||
return exp_assop (dst, src, etree_assign, TRUE, FALSE);
|
||||
}
|
||||
|
||||
/* Handle PROVIDE. */
|
||||
|
@ -1086,7 +1092,7 @@ exp_defsym (const char *dst, etree_type *src)
|
|||
etree_type *
|
||||
exp_provide (const char *dst, etree_type *src, bfd_boolean hidden)
|
||||
{
|
||||
return exp_assop (dst, src, etree_provide, hidden);
|
||||
return exp_assop (dst, src, etree_provide, FALSE, hidden);
|
||||
}
|
||||
|
||||
/* Handle ASSERT. */
|
||||
|
|
|
@ -67,6 +67,7 @@ typedef union etree_union {
|
|||
node_type type;
|
||||
const char *dst;
|
||||
union etree_union *src;
|
||||
bfd_boolean defsym;
|
||||
bfd_boolean hidden;
|
||||
} assign;
|
||||
struct {
|
||||
|
@ -199,7 +200,7 @@ etree_type *exp_unop
|
|||
etree_type *exp_nameop
|
||||
(int, const char *);
|
||||
etree_type *exp_assign
|
||||
(const char *, etree_type *);
|
||||
(const char *, etree_type *, bfd_boolean);
|
||||
etree_type *exp_defsym
|
||||
(const char *, etree_type *);
|
||||
etree_type *exp_provide
|
||||
|
|
12
ld/ldgram.y
12
ld/ldgram.y
|
@ -146,7 +146,7 @@ static int error_index;
|
|||
%token STARTUP HLL SYSLIB FLOAT NOFLOAT NOCROSSREFS
|
||||
%token ORIGIN FILL
|
||||
%token LENGTH CREATE_OBJECT_SYMBOLS INPUT GROUP OUTPUT CONSTRUCTORS
|
||||
%token ALIGNMOD AT SUBALIGN PROVIDE PROVIDE_HIDDEN AS_NEEDED
|
||||
%token ALIGNMOD AT SUBALIGN HIDDEN PROVIDE PROVIDE_HIDDEN AS_NEEDED
|
||||
%type <token> assign_op atype attributes_opt sect_constraint
|
||||
%type <name> filename
|
||||
%token CHIP LIST SECT ABSOLUTE LOAD NEWLINE ENDWORD ORDER NAMEWORD ASSERT_K
|
||||
|
@ -759,7 +759,7 @@ end: ';' | ','
|
|||
assignment:
|
||||
NAME '=' mustbe_exp
|
||||
{
|
||||
lang_add_assignment (exp_assign ($1, $3));
|
||||
lang_add_assignment (exp_assign ($1, $3, FALSE));
|
||||
}
|
||||
| NAME assign_op mustbe_exp
|
||||
{
|
||||
|
@ -767,7 +767,11 @@ assignment:
|
|||
exp_binop ($2,
|
||||
exp_nameop (NAME,
|
||||
$1),
|
||||
$3)));
|
||||
$3), FALSE));
|
||||
}
|
||||
| HIDDEN '(' NAME '=' mustbe_exp ')'
|
||||
{
|
||||
lang_add_assignment (exp_assign ($3, $5, TRUE));
|
||||
}
|
||||
| PROVIDE '(' NAME '=' mustbe_exp ')'
|
||||
{
|
||||
|
@ -1085,7 +1089,7 @@ section: NAME { ldlex_expression(); }
|
|||
opt_exp_with_type
|
||||
{
|
||||
ldlex_popstate ();
|
||||
lang_add_assignment (exp_assign (".", $3));
|
||||
lang_add_assignment (exp_assign (".", $3, FALSE));
|
||||
}
|
||||
'{' sec_or_group_p1 '}'
|
||||
| INCLUDE filename
|
||||
|
|
|
@ -3286,7 +3286,7 @@ open_input_bfds (lang_statement_union_type *s, enum open_bfd_mode mode)
|
|||
#endif
|
||||
break;
|
||||
case lang_assignment_statement_enum:
|
||||
if (s->assignment_statement.exp->assign.hidden)
|
||||
if (s->assignment_statement.exp->assign.defsym)
|
||||
/* This is from a --defsym on the command line. */
|
||||
exp_fold_tree_no_dot (s->assignment_statement.exp);
|
||||
break;
|
||||
|
@ -7437,7 +7437,7 @@ lang_leave_overlay (etree_type *lma_expr,
|
|||
{
|
||||
overlay_list->os->update_dot = 1;
|
||||
overlay_list->os->update_dot_tree
|
||||
= exp_assign (".", exp_binop ('+', overlay_vma, overlay_max));
|
||||
= exp_assign (".", exp_binop ('+', overlay_vma, overlay_max), FALSE);
|
||||
}
|
||||
|
||||
l = overlay_list;
|
||||
|
|
|
@ -320,6 +320,7 @@ V_IDENTIFIER [*?.$_a-zA-Z\[\]\-\!\^\\]([*?.$_a-zA-Z0-9\[\]\-\!\^\\]|::)*
|
|||
<BOTH,SCRIPT>"PHDRS" { RTOKEN (PHDRS); }
|
||||
<EXPRESSION,BOTH,SCRIPT>"AT" { RTOKEN(AT);}
|
||||
<EXPRESSION,BOTH,SCRIPT>"SUBALIGN" { RTOKEN(SUBALIGN);}
|
||||
<EXPRESSION,BOTH,SCRIPT>"HIDDEN" { RTOKEN(HIDDEN); }
|
||||
<EXPRESSION,BOTH,SCRIPT>"PROVIDE" { RTOKEN(PROVIDE); }
|
||||
<EXPRESSION,BOTH,SCRIPT>"PROVIDE_HIDDEN" { RTOKEN(PROVIDE_HIDDEN); }
|
||||
<EXPRESSION,BOTH,SCRIPT>"KEEP" { RTOKEN(KEEP); }
|
||||
|
|
2
ld/mri.c
2
ld/mri.c
|
@ -297,7 +297,7 @@ mri_format (const char *name)
|
|||
void
|
||||
mri_public (const char *name, etree_type *exp)
|
||||
{
|
||||
lang_add_assignment (exp_assign (name, exp));
|
||||
lang_add_assignment (exp_assign (name, exp, FALSE));
|
||||
}
|
||||
|
||||
void
|
||||
|
|
Loading…
Reference in a new issue