* symtab.h (Symbol::use_plt_offset): New function.
[deliverable/binutils-gdb.git] / ld / ldexp.c
index 4f1d61d28deabdf67118b6c981595699f1818b9d..3c6ad0c350cc26eb0bd42a051d1c2992dd19fcf1 100644 (file)
@@ -1,25 +1,26 @@
 /* This module handles expression trees.
    Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
-   2001, 2002, 2003, 2004, 2005, 2006, 2007
+   2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
    Free Software Foundation, Inc.
    Written by Steve Chamberlain of Cygnus Support <sac@cygnus.com>.
 
-   This file is part of GLD, the Gnu Linker.
+   This file is part of the GNU Binutils.
 
-   GLD is free software; you can redistribute it and/or modify
+   This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, or (at your option)
-   any later version.
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
 
-   GLD is distributed in the hope that it will be useful,
+   This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with GLD; see the file COPYING.  If not, write to the Free
-   Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
-   02110-1301, USA.  */
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
 
 /* This module is in charge of working out the contents of expressions.
 
@@ -102,7 +103,10 @@ exp_print_token (token_code_type code, int infix_p)
     { ADDR, "ADDR" },
     { LOADADDR, "LOADADDR" },
     { CONSTANT, "CONSTANT" },
-    { MAX_K, "MAX_K" },
+    { ABSOLUTE, "ABSOLUTE" },
+    { MAX_K, "MAX" },
+    { MIN_K, "MIN" },
+    { ASSERT_K, "ASSERT" },
     { REL, "relocatable" },
     { DATA_SEGMENT_ALIGN, "DATA_SEGMENT_ALIGN" },
     { DATA_SEGMENT_RELRO_END, "DATA_SEGMENT_RELRO_END" },
@@ -281,7 +285,9 @@ fold_binary (etree_type *tree)
   exp_fold_tree_1 (tree->binary.lhs);
 
   /* The SEGMENT_START operator is special because its first
-     operand is a string, not the name of a symbol.  */
+     operand is a string, not the name of a symbol.  Note that the
+     operands have been swapped, so binary.lhs is second (default)
+     operand, binary.rhs is first operand.  */
   if (expld.result.valid_p && tree->type.node_code == SEGMENT_START)
     {
       const char *segment_name;
@@ -295,7 +301,7 @@ fold_binary (etree_type *tree)
            seg->used = TRUE;
            expld.result.value = seg->value;
            expld.result.str = NULL;
-           expld.result.section = NULL;
+           expld.result.section = expld.section;
            break;
          }
     }
@@ -320,9 +326,9 @@ fold_binary (etree_type *tree)
              return;
            }
          else if (expld.section != bfd_abs_section_ptr
-             && expld.result.section == bfd_abs_section_ptr
-             && (tree->type.node_code == '+'
-                 || tree->type.node_code == '-'))
+                  && expld.result.section == bfd_abs_section_ptr
+                  && (tree->type.node_code == '+'
+                      || tree->type.node_code == '-'))
            {
              /* Keep the section of the lhs term.  */
              expld.result.section = lhs.section;
@@ -389,6 +395,7 @@ fold_binary (etree_type *tree)
              break;
 
            case DATA_SEGMENT_ALIGN:
+             expld.dataseg.relro = exp_dataseg_relro_start;
              if (expld.phase != lang_first_phase_enum
                  && expld.section == bfd_abs_section_ptr
                  && (expld.dataseg.phase == exp_dataseg_none
@@ -424,6 +431,7 @@ fold_binary (etree_type *tree)
              break;
 
            case DATA_SEGMENT_RELRO_END:
+             expld.dataseg.relro = exp_dataseg_relro_end;
              if (expld.phase != lang_first_phase_enum
                  && (expld.dataseg.phase == exp_dataseg_align_seen
                      || expld.dataseg.phase == exp_dataseg_adjust
@@ -486,7 +494,7 @@ fold_name (etree_type *tree)
          /* Don't find the real header size if only marking sections;
             The bfd function may cache incorrect data.  */
          if (expld.phase != lang_mark_phase_enum)
-           hdr_size = bfd_sizeof_headers (output_bfd, &link_info);
+           hdr_size = bfd_sizeof_headers (link_info.output_bfd, &link_info);
          new_abs (hdr_size);
        }
       break;
@@ -500,7 +508,8 @@ fold_name (etree_type *tree)
          int def_iteration
            = lang_symbol_definition_iteration (tree->name.name);
 
-         h = bfd_wrapped_link_hash_lookup (output_bfd, &link_info,
+         h = bfd_wrapped_link_hash_lookup (link_info.output_bfd,
+                                           &link_info,
                                            tree->name.name,
                                            FALSE, FALSE, TRUE);
          expld.result.value = (h != NULL
@@ -509,7 +518,7 @@ fold_name (etree_type *tree)
                                    || h->type == bfd_link_hash_common)
                                && (def_iteration == lang_statement_iteration
                                    || def_iteration == -1));
-         expld.result.section = bfd_abs_section_ptr;
+         expld.result.section = expld.section;
          expld.result.valid_p = TRUE;
        }
       break;
@@ -523,7 +532,8 @@ fold_name (etree_type *tree)
        {
          struct bfd_link_hash_entry *h;
 
-         h = bfd_wrapped_link_hash_lookup (output_bfd, &link_info,
+         h = bfd_wrapped_link_hash_lookup (link_info.output_bfd,
+                                           &link_info,
                                            tree->name.name,
                                            TRUE, FALSE, TRUE);
          if (!h)
@@ -600,7 +610,8 @@ fold_name (etree_type *tree)
              else
                {
                  exp_fold_tree_1 (os->load_base);
-                 make_abs ();
+                 if (expld.result.valid_p)
+                   make_abs ();
                }
            }
        }
@@ -625,7 +636,8 @@ fold_name (etree_type *tree)
              bfd_vma val;
 
              if (tree->type.node_code == SIZEOF)
-               val = os->bfd_section->size / bfd_octets_per_byte (output_bfd);
+               val = (os->bfd_section->size
+                      / bfd_octets_per_byte (link_info.output_bfd));
              else
                val = (bfd_vma)1 << os->bfd_section->alignment_power;
              
@@ -1051,7 +1063,7 @@ exp_get_vma (etree_type *tree, bfd_vma def, char *name)
       if (expld.result.valid_p)
        return expld.result.value;
       else if (name != NULL && expld.phase != lang_mark_phase_enum)
-       einfo (_("%F%S nonconstant expression for %s\n"), name);
+       einfo (_("%F%S: nonconstant expression for %s\n"), name);
     }
   return def;
 }
@@ -1076,7 +1088,7 @@ exp_get_fill (etree_type *tree, fill_type *def, char *name)
   if (!expld.result.valid_p)
     {
       if (name != NULL && expld.phase != lang_mark_phase_enum)
-       einfo (_("%F%S nonconstant expression for %s\n"), name);
+       einfo (_("%F%S: nonconstant expression for %s\n"), name);
       return def;
     }
 
This page took 0.026117 seconds and 4 git commands to generate.