b45e00b3ed
If a symbol is defined with ".symver foo,foo@VER", the assembler creates two symbols in the object: one unversioned, and one with the (non-default) version "VER". If foo is listed in a version script, gold would then make the first of those symbols the default version, and would ignore the second symbol as a duplicate, without making it a non-default version. While this is arguably reasonable behavior, it doesn't match Gnu ld behavior, so this patch fixes that by allowing the second definition to override the first by resetting the "default version" indication. Several test cases from the Gnu ld testsuite also exposed another related problem, where a symbol defined with ".symver foo,foo@", placed into a shared library, is not handled properly by gold. This patch also fixes that case, binding the symbol to the base version. gold/ PR gold/18703 * dynobj.cc (Versions::record_version): Handle symbol defined with base version. (Versions::symbol_section_contents): Likewise. * symtab.h (Symbol::set_is_not_default): New class method. (Symbol_table::resolve): Add is_default_version parameter. (Symbol_table::should_override): Likewise. * resolve.cc (Symbol_table::resolve): Add is_default_version parameter, and pass to should_override. Adjust all callers and explicit instantiations. (Symbol_table::should_override): Add is_default_value parameter; allow default version in a dynamic object to override existing definition from same object. * symtab.cc (Symbol_table::add_from_object): Handle case where same symbol is defined as unversioned and non-default version in the same object. * testsuite/Makefile.am (ver_test_13): New test case. * testsuite/Makefile.in: Regenerate. * testsuite/ver_test_4.cc: Add test for symbol with base version. * testsuite/ver_test_4.sh: Likewise. * testsuite/ver_test_13.c: New source file. * testsuite/ver_test_13.script: New version script. * testsuite/ver_test_13.sh: New test case.
74 lines
1.4 KiB
C++
74 lines
1.4 KiB
C++
// ver_test_4.cc -- a test case for gold
|
|
|
|
// Copyright (C) 2007-2015 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.
|
|
|
|
#include "ver_test.h"
|
|
|
|
__asm__(".symver t1_2_orig,t1_2@");
|
|
|
|
extern "C"
|
|
int
|
|
t1_2_orig()
|
|
{
|
|
TRACE
|
|
return 12;
|
|
}
|
|
|
|
__asm__(".symver t1_2_a,t1_2@@VER2");
|
|
|
|
extern "C"
|
|
int
|
|
t1_2_a()
|
|
{
|
|
TRACE
|
|
return 12;
|
|
}
|
|
|
|
__asm__(".symver t2_2_a,t2_2@VER1");
|
|
|
|
extern "C"
|
|
int
|
|
t2_2_a()
|
|
{
|
|
TRACE
|
|
return 21;
|
|
}
|
|
|
|
__asm__(".symver t2_2_b,t2_2@@VER2");
|
|
|
|
extern "C"
|
|
int
|
|
t2_2_b()
|
|
{
|
|
TRACE
|
|
return 22;
|
|
}
|
|
|
|
|
|
// This function is given a version by the version script, and should
|
|
// be overridden by the main program.
|
|
|
|
int
|
|
t4_2a()
|
|
{
|
|
TRACE
|
|
return -42;
|
|
}
|