Update year range in copyright notice of binutils files
[deliverable/binutils-gdb.git] / gold / testsuite / weak_undef_test.cc
index 1a6e17f5e97c22856ff5678e22ebd068ee314a71..fd147e04a936ace712e8233288a1915a2e7d8364 100644 (file)
@@ -1,6 +1,6 @@
 // weak_undef_test.cc -- test handling of weak undefined symbols for gold
 
-// Copyright 2008 Free Software Foundation, Inc.
+// Copyright (C) 2008-2019 Free Software Foundation, Inc.
 // Written by Cary Coutant <ccoutant@google.com>.
 
 // This file is part of gold.
 // MA 02110-1301, USA.
 
 // We test that we correctly deal with weak undefined symbols.
-// We need to make sure that the symbol is resolved to zero
-// by the linker and that no dynamic relocation is generated.
+// We need to make sure that a weak undefined symbol in the main
+// program is resolved to zero by the linker and that no dynamic
+// relocation is generated.  We also make sure that a weak undefined
+// symbol in a shared library can resolve to a symbol in the main
+// program.
 
 // This file will be linked with a shared library that does not
 // define the symbol, so that the symbol remains undefined.
 // so that we can detect whether the symbol was left for runtime
 // resolution.
 
+// Similarly, this file will be linked with a shared library that
+// does define a different symbol, and loaded with an alternate
+// shared library that does not define that symbol.  We check that
+// the weak reference remains weak, and that it is resolved to
+// zero at runtime.
+
 
 #include <cstdio>
+#include "weak_undef.h"
 
 extern int no_such_symbol_ __attribute__ ((weak));
 
+extern int link_time_only __attribute__ ((weak));
+
+int *p1 = &no_such_symbol_;
+
+int *p2 = &link_time_only;
+
+int v2 = 42;
+
 int
 main()
 {
+  int status = 0;
+  int v;
+
+  if ((v = t1()) != 2)
+    {
+      fprintf(stderr, "FAILED weak undef test 1: %s\n",
+              "bound to wrong library");
+      status = 1;
+    }
+
+  if ((v = t2()) != 42)
+    {
+      fprintf(stderr, "FAILED weak undef test 2: expected %d, got %d\n",
+              42, v);
+      status = 1;
+    }
+
+  if ((v = t3()) != 42)
+    {
+      fprintf(stderr, "FAILED weak undef test 3: expected %d, got %d\n",
+              42, v);
+      status = 1;
+    }
+
   if (&no_such_symbol_ != NULL)
     {
-      fprintf(stderr, "FAILED the weak undef test: &no_such_symbol_ is not NULL\n");
-      return 1;
+      fprintf(stderr, "FAILED weak undef test 4: %s\n",
+              "&no_such_symbol_ is not NULL");
+      status = 1;
     }
-  return 0;
+
+  if (p1 != NULL)
+    {
+      fprintf(stderr, "FAILED weak undef test 5: %s\n",
+              "p1 is not NULL");
+      status = 1;
+    }
+
+  if (p2 != NULL)
+    {
+      fprintf(stderr, "FAILED weak undef test 6: %s\n",
+              "p2 is not NULL");
+      status = 1;
+    }
+
+  return status;
 }
This page took 0.024794 seconds and 4 git commands to generate.