| // weak_undef_file2.cc -- test handling of weak undefined symbols for gold |
| |
| // Copyright (C) 2008-2021 Free Software Foundation, Inc. |
| // Written by Cary Coutant <ccoutant@google.com>. |
| |
| // This file is part of gold. |
| |
| // 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 3 of the License, or |
| // (at your option) any later version. |
| |
| // 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 this program; if not, write to the Free Software |
| // Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
| // 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. |
| |
| // This source is used to build a shared library that defines |
| // the weak undefined symbol referenced by the main program. |
| // The main program will be linked with a library that does not |
| // provide this definition, so that the symbol remains undefined. |
| // Through the use of the embedded RPATH, the program will load |
| // this alternate shared library that does define the symbol, |
| // so that we can detect whether the symbol was left for runtime |
| // resolution. |
| |
| |
| #include <cstdio> |
| |
| #include "weak_undef.h" |
| |
| int is_such_symbol_ = 1; |
| int no_such_symbol_ = 2; |
| |
| extern int v2 __attribute__ ((weak)); |
| |
| int *v3 = &v2; |
| |
| int |
| t1() |
| { |
| return no_such_symbol_; |
| } |
| |
| // Test that a weak reference from a shared library to a symbol |
| // defined in the main program does get resolved. |
| |
| int |
| t2() |
| { |
| return (&v2 == NULL) ? -1 : v2; |
| } |
| |
| // Test that a weak reference from a shared library to a symbol |
| // defined in the main program does get resolved. |
| |
| int |
| t3() |
| { |
| return (v3 == NULL) ? -1 : *v3; |
| } |