Take into account MEMORY regions when creating a segment map.
[deliverable/binutils-gdb.git] / ld / ldexp.c
index 71f4c8e31547a4fb951acc3ac4cbe06fdc042dd8..7ac0032627a37466c10bee1f9a04f80c1a818253 100644 (file)
@@ -1,6 +1,6 @@
 /* This module handles expression trees.
    Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
-   2001, 2002, 2003, 2004, 2005, 2006
+   2001, 2002, 2003, 2004, 2005, 2006, 2007
    Free Software Foundation, Inc.
    Written by Steve Chamberlain of Cygnus Support <sac@cygnus.com>.
 
@@ -485,6 +485,7 @@ fold_name (etree_type *tree)
          new_abs (hdr_size);
        }
       break;
+
     case DEFINED:
       if (expld.phase == lang_first_phase_enum)
        lang_track_definedness (tree->name.name);
@@ -507,6 +508,7 @@ fold_name (etree_type *tree)
          expld.result.valid_p = TRUE;
        }
       break;
+
     case NAME:
       if (expld.phase == lang_first_phase_enum)
        ;
@@ -563,7 +565,13 @@ fold_name (etree_type *tree)
          lang_output_section_statement_type *os;
 
          os = lang_output_section_find (tree->name.name);
-         if (os != NULL && os->processed)
+         if (os == NULL)
+           {
+             if (expld.phase == lang_final_phase_enum)
+               einfo (_("%F%S: undefined section `%s' referenced in expression\n"),
+                      tree->name.name);
+           }
+         else if (os->processed_vma)
            new_rel (0, NULL, os->bfd_section);
        }
       break;
@@ -574,13 +582,21 @@ fold_name (etree_type *tree)
          lang_output_section_statement_type *os;
 
          os = lang_output_section_find (tree->name.name);
-         if (os != NULL && os->processed)
+         if (os == NULL)
+           {
+             if (expld.phase == lang_final_phase_enum)
+               einfo (_("%F%S: undefined section `%s' referenced in expression\n"),
+                      tree->name.name);
+           }
+         else if (os->processed_lma)
            {
              if (os->load_base == NULL)
-               new_rel (os->bfd_section->lma - os->bfd_section->vma,
-                        NULL, os->bfd_section);
+               new_abs (os->bfd_section->lma);
              else
-               exp_fold_tree_1 (os->load_base);
+               {
+                 exp_fold_tree_1 (os->load_base);
+                 make_abs ();
+               }
            }
        }
       break;
@@ -593,8 +609,13 @@ fold_name (etree_type *tree)
 
          os = lang_output_section_find (tree->name.name);
          if (os == NULL)
-           new_abs (0);
-         else if (os->processed)
+           {
+             if (expld.phase == lang_final_phase_enum)
+               einfo (_("%F%S: undefined section `%s' referenced in expression\n"),
+                      tree->name.name);
+             new_abs (0);
+           }
+         else if (os->processed_vma)
            new_abs (os->bfd_section->size / opb);
        }
       break;
This page took 0.024392 seconds and 4 git commands to generate.