LD: Export relative-from-absolute symbol marking to BFD
authorMaciej W. Rozycki <macro@mips.com>
Tue, 17 Jul 2018 19:04:53 +0000 (20:04 +0100)
committerMaciej W. Rozycki <macro@mips.com>
Tue, 17 Jul 2018 19:04:53 +0000 (20:04 +0100)
It is usually possible to tell absolute and ordinary symbols apart in
BFD throughout the link, by checking whether the section that owns the
symbol is absolute or not.

That however does not work for ordinary symbols defined in a linker
script outside an output section statement.  Initially such symbols are
entered into to the link hash as absolute symbols, owned by the absolute
section.  A flag is set in the internal linker expression defining such
symbols to tell the linker to convert them to section-relative ones in
the final phase of the link.  That flag is however not accessible to BFD
linker code, including BFD target code in particular.

Add a flag to the link hash then to copy the information held in the
linker expression.  Define a macro, `bfd_is_abs_symbol', for BFD code to
use where determining whether a symbol is absolute or ordinary is
required before the final link phase.

This macro will correctly identify the special `__ehdr_start' symbol as
ordinary throughout link, for example, even though early on it will be
assigned to the absolute section.  Of course this does not let BFD code
identify what the symbol's ultimate section will be before the final
link phase has converted this symbol (in `update_definedness').

include/
* bfdlink.h (bfd_link_hash_entry): Add `rel_from_abs' member.

bfd/
* linker.c (bfd_is_abs_symbol): New macro.
* bfd-in2.h: Regenerate.

ld/
* ldexp.c (exp_fold_tree_1) <etree_assign, etree_provide>
<etree_provided>: Copy expression's `rel_from_abs' flag to the
link hash.

bfd/ChangeLog
bfd/bfd-in2.h
bfd/linker.c
include/ChangeLog
include/bfdlink.h
ld/ChangeLog
ld/ldexp.c

index d4ae7ed562dda7bfae4bc7fb1483241f1f203dc8..008d416d2714197f454f445c02a76cbaba79a44e 100644 (file)
@@ -1,3 +1,8 @@
+2018-07-17  Maciej W. Rozycki  <macro@mips.com>
+
+       * linker.c (bfd_is_abs_symbol): New macro.
+       * bfd-in2.h: Regenerate.
+
 2018-07-16  Edjunior Barbosa Machado  <emachado@linux.vnet.ibm.com>
 
        * elf-bfd.h (elfcore_write_ppc_tar): Add prototype.
index 93745bd3fdcb27e84cc4d797136d28e77a679096..34146829882fef55e8ec05695996c7a9f0c81281 100644 (file)
@@ -7802,6 +7802,17 @@ bfd_boolean bfd_set_format (bfd *abfd, bfd_format format);
 const char *bfd_format_string (bfd_format format);
 
 /* Extracted from linker.c.  */
+/* Return TRUE if the symbol described by a linker hash entry H
+   is going to be absolute.  Linker-script defined symbols can be
+   converted from absolute to section-relative ones late in the
+   link.  Use this macro to correctly determine whether the symbol
+   will actually end up absolute in output.  */
+#define bfd_is_abs_symbol(H) \
+  (((H)->type == bfd_link_hash_defined \
+    || (H)->type == bfd_link_hash_defweak) \
+   && bfd_is_abs_section ((H)->u.def.section) \
+   && !(H)->rel_from_abs)
+
 bfd_boolean bfd_link_split_section (bfd *abfd, asection *sec);
 
 #define bfd_link_split_section(abfd, sec) \
index 6b4c8e57e1186a4a4682b89b72415829437dbf97..9fee90d1010fb50eb1a418b88cec9090448e933b 100644 (file)
@@ -484,7 +484,20 @@ _bfd_link_hash_table_init
 
 /* Look up a symbol in a link hash table.  If follow is TRUE, we
    follow bfd_link_hash_indirect and bfd_link_hash_warning links to
-   the real symbol.  */
+   the real symbol.
+
+.{* Return TRUE if the symbol described by a linker hash entry H
+.   is going to be absolute.  Linker-script defined symbols can be
+.   converted from absolute to section-relative ones late in the
+.   link.  Use this macro to correctly determine whether the symbol
+.   will actually end up absolute in output.  *}
+.#define bfd_is_abs_symbol(H) \
+.  (((H)->type == bfd_link_hash_defined \
+.    || (H)->type == bfd_link_hash_defweak) \
+.   && bfd_is_abs_section ((H)->u.def.section) \
+.   && !(H)->rel_from_abs)
+.
+*/
 
 struct bfd_link_hash_entry *
 bfd_link_hash_lookup (struct bfd_link_hash_table *table,
index 035b3ca21770996e548075deee9d725983feab78..a3b1af88e334033034e7fc824afda4c114f4404b 100644 (file)
@@ -1,3 +1,7 @@
+2018-07-17  Maciej W. Rozycki  <macro@mips.com>
+
+       * bfdlink.h (bfd_link_hash_entry): Add `rel_from_abs' member.
+
 2018-07-06  Alan Modra  <amodra@gmail.com>
 
        * diagnostics.h: Comment on macro usage.
index 773407f8614d47e06d408e71eacad079affb8f7e..249108132cccc7686e534aa46e7dd8f21f834e89 100644 (file)
@@ -115,6 +115,11 @@ struct bfd_link_hash_entry
   /* Symbol defined in a linker script.  */
   unsigned int ldscript_def : 1;
 
+  /* Symbol will be converted from absolute to section-relative.  Set for
+     symbols defined by a script from "dot" (also SEGMENT_START or ORIGIN)
+     outside of an output section statement.  */
+  unsigned int rel_from_abs : 1;
+
   /* A union of information depending upon the type.  */
   union
     {
index f5af858e55ad5f35515fbb29acac8948406d3ac0..0a0fa158e149097724f54e25c63e9024df2e5c44 100644 (file)
@@ -1,3 +1,9 @@
+2018-07-17  Maciej W. Rozycki  <macro@mips.com>
+
+       * ldexp.c (exp_fold_tree_1) <etree_assign, etree_provide>
+       <etree_provided>: Copy expression's `rel_from_abs' flag to the
+       link hash.
+
 2018-07-12  Maciej W. Rozycki  <macro@mips.com>
 
        * testsuite/ld-mips-elf/mips-elf.exp (run_dump_test_abi)
index 6fa251e79e4b500141d5e851e3c55a6a73629d84..4ca812e9b20c93fba004225864351f94f623bab1 100644 (file)
@@ -1200,6 +1200,7 @@ exp_fold_tree_1 (etree_type *tree)
                  h->u.def.section = expld.result.section;
                  h->linker_def = ! tree->assign.type.lineno;
                  h->ldscript_def = 1;
+                 h->rel_from_abs = expld.rel_from_abs;
                  if (tree->assign.hidden)
                    bfd_link_hide_symbol (link_info.output_bfd,
                                          &link_info, h);