Update description of the ASSERT linker script command to note its interation with...
authorNick Clifton <nickc@redhat.com>
Thu, 14 May 2015 11:32:12 +0000 (12:32 +0100)
committerNick Clifton <nickc@redhat.com>
Thu, 14 May 2015 11:32:12 +0000 (12:32 +0100)
* ld.texinfo (ASSERT): Describe the interaction with PROVIDEd
symbols.

ld/ChangeLog
ld/ld.texinfo

index 4cd77f7..f849318 100644 (file)
@@ -1,3 +1,8 @@
+2015-05-14  Nick Clifton  <nickc@redhat.com>
+
+       * ld.texinfo (ASSERT): Describe the interaction with PROVIDEd
+       symbols.
+
 2015-05-11  H.J. Lu  <hongjiu.lu@intel.com>
 
        * configure.tgt: Support i[3-7]86-*-elfiamcu target.
index 77c02d6..0c5f884 100644 (file)
@@ -3473,6 +3473,36 @@ There are a few other linker scripts commands.
 Ensure that @var{exp} is non-zero.  If it is zero, then exit the linker
 with an error code, and print @var{message}.
 
+Note that assertions are checked before the final stages of linking
+take place.  This means that expressions involving symbols PROVIDEd
+inside section definitions will fail if the user has not set values
+for those symbols.  The only exception to this rule is PROVIDEd
+symbols that just reference dot.  Thus an assertion like this:
+
+@smallexample
+  .stack :
+  @{
+    PROVIDE (__stack = .);
+    PROVIDE (__stack_size = 0x100);
+    ASSERT ((__stack > (_end + __stack_size)), "Error: No room left for the stack");
+  @}
+@end smallexample
+
+will fail if @code{__stack_size} is not defined elsewhere.  Symbols
+PROVIDEd outside of section definitions are evaluated earlier, so they
+can be used inside ASSERTions.  Thus:
+
+@smallexample
+  PROVIDE (__stack_size = 0x100);
+  .stack :
+  @{
+    PROVIDE (__stack = .);
+    ASSERT ((__stack > (_end + __stack_size)), "Error: No room left for the stack");
+  @}
+@end smallexample
+
+will work.
+
 @item EXTERN(@var{symbol} @var{symbol} @dots{})
 @kindex EXTERN
 @cindex undefined symbol in linker script