From eb8476a6e2fc115c0a953392e61ab27c7568a2a8 Mon Sep 17 00:00:00 2001 From: "Maciej W. Rozycki" Date: Mon, 6 Aug 2012 22:27:52 +0000 Subject: [PATCH] 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. --- bfd/ChangeLog | 5 +++++ bfd/elflink.c | 2 +- ld/ChangeLog | 29 +++++++++++++++++++++++++++++ ld/emultempl/beos.em | 3 ++- ld/emultempl/pe.em | 7 ++++--- ld/emultempl/pep.em | 7 ++++--- ld/emultempl/spuelf.em | 2 +- ld/emultempl/xtensaelf.em | 2 +- ld/ld.texinfo | 26 ++++++++++++++++++++++++++ ld/ldctor.c | 6 ++++-- ld/ldexp.c | 16 +++++++++++----- ld/ldexp.h | 3 ++- ld/ldgram.y | 12 ++++++++---- ld/ldlang.c | 4 ++-- ld/ldlex.l | 1 + ld/mri.c | 2 +- 16 files changed, 102 insertions(+), 25 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 30fff7aaba..267a6ee6ca 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,8 @@ +2012-08-06 Maciej W. Rozycki + + * elflink.c (bfd_elf_record_link_assignment): Remove --defsym + symbols special case. + 2012-08-05 Maciej W. Rozycki * elf32-vax.c (elf_vax_adjust_dynamic_symbol): Don't allocate diff --git a/bfd/elflink.c b/bfd/elflink.c index 574b6e2949..733511491d 100644 --- a/bfd/elflink.c +++ b/bfd/elflink.c @@ -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; diff --git a/ld/ChangeLog b/ld/ChangeLog index c066fefcbe..451f11069e 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,32 @@ +2012-08-06 Maciej W. Rozycki + + * 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 PR ld/14156 diff --git a/ld/emultempl/beos.em b/ld/emultempl/beos.em index 2071d8ef99..f59e000dea 100644 --- a/ld/emultempl/beos.em +++ b/ld/emultempl/beos.em @@ -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)) diff --git a/ld/emultempl/pe.em b/ld/emultempl/pe.em index 947f6ad71f..a565eb7f78 100644 --- a/ld/emultempl/pe.em +++ b/ld/emultempl/pe.em @@ -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 diff --git a/ld/emultempl/pep.em b/ld/emultempl/pep.em index d3f5c83b9c..fc3cdc3943 100644 --- a/ld/emultempl/pep.em +++ b/ld/emultempl/pep.em @@ -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 diff --git a/ld/emultempl/spuelf.em b/ld/emultempl/spuelf.em index eef57aa7cc..1b35612233 100644 --- a/ld/emultempl/spuelf.em +++ b/ld/emultempl/spuelf.em @@ -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); diff --git a/ld/emultempl/xtensaelf.em b/ld/emultempl/xtensaelf.em index b37a67b2fe..1e6eb0751c 100644 --- a/ld/emultempl/xtensaelf.em +++ b/ld/emultempl/xtensaelf.em @@ -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; diff --git a/ld/ld.texinfo b/ld/ld.texinfo index d0a5d907bf..dd3149c8df 100644 --- a/ld/ld.texinfo +++ b/ld/ld.texinfo @@ -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 diff --git a/ld/ldctor.c b/ld/ldctor.c index 1a86eb38e8..b29c1e0cbb 100644 --- a/ld/ldctor.c +++ b/ld/ldctor.c @@ -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) diff --git a/ld/ldexp.c b/ld/ldexp.c index be296bccf5..cc43b7225c 100644 --- a/ld/ldexp.c +++ b/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. */ diff --git a/ld/ldexp.h b/ld/ldexp.h index 586dd13f62..187016c4f8 100644 --- a/ld/ldexp.h +++ b/ld/ldexp.h @@ -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 diff --git a/ld/ldgram.y b/ld/ldgram.y index 6e001184e0..ee8819660c 100644 --- a/ld/ldgram.y +++ b/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 assign_op atype attributes_opt sect_constraint %type 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 diff --git a/ld/ldlang.c b/ld/ldlang.c index 0f5c91a328..0c978983dd 100644 --- a/ld/ldlang.c +++ b/ld/ldlang.c @@ -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; diff --git a/ld/ldlex.l b/ld/ldlex.l index c24d1ab52a..abe31c01f5 100644 --- a/ld/ldlex.l +++ b/ld/ldlex.l @@ -320,6 +320,7 @@ V_IDENTIFIER [*?.$_a-zA-Z\[\]\-\!\^\\]([*?.$_a-zA-Z0-9\[\]\-\!\^\\]|::)* "PHDRS" { RTOKEN (PHDRS); } "AT" { RTOKEN(AT);} "SUBALIGN" { RTOKEN(SUBALIGN);} +"HIDDEN" { RTOKEN(HIDDEN); } "PROVIDE" { RTOKEN(PROVIDE); } "PROVIDE_HIDDEN" { RTOKEN(PROVIDE_HIDDEN); } "KEEP" { RTOKEN(KEEP); } diff --git a/ld/mri.c b/ld/mri.c index 91b40dc779..fc7076af8e 100644 --- a/ld/mri.c +++ b/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 -- 2.34.1