This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
PATCH COMMITTED: Don't force version symbols to be local
- From: Ian Lance Taylor <iant at google dot com>
- To: binutils at sourceware dot org
- Date: Sat, 29 Mar 2008 01:40:52 -0700
- Subject: PATCH COMMITTED: Don't force version symbols to be local
With a linker script that forced all unspecified symbols to be local,
gold was accidentally forcing version symbols to be local. This
caused the libstdc++ abi test to fail. This patch corrects that, with
a test case.
Ian
2008-03-29 Ian Lance Taylor <iant@google.com>
* symtab.cc (Symbol_table::do_define_as_constant): Don't force a
version symbol to be local.
* testsuite/ver_test_4.sh: New file.
* testsuite/Makefile.am (check_SCRIPTS): Add ver_test_4.sh.
(check_DATA): Add ver_test_4.syms.
(ver_test_4.syms): New target.
* testsuite/Makefile.in: Rebuild.
Index: symtab.cc
===================================================================
RCS file: /cvs/src/src/gold/symtab.cc,v
retrieving revision 1.86
diff -u -p -r1.86 symtab.cc
--- symtab.cc 29 Mar 2008 07:19:02 -0000 1.86
+++ symtab.cc 29 Mar 2008 08:37:11 -0000
@@ -1406,8 +1406,13 @@ Symbol_table::do_define_as_constant(
if (oldsym == NULL)
{
- if (binding == elfcpp::STB_LOCAL
- || this->version_script_.symbol_is_local(name))
+ // Version symbols are absolute symbols with name == version.
+ // We don't want to force them to be local.
+ if ((version == NULL
+ || name != version
+ || value != 0)
+ && (binding == elfcpp::STB_LOCAL
+ || this->version_script_.symbol_is_local(name)))
this->force_local(sym);
return sym;
}
Index: testsuite/Makefile.am
===================================================================
RCS file: /cvs/src/src/gold/testsuite/Makefile.am,v
retrieving revision 1.52
diff -u -p -r1.52 Makefile.am
--- testsuite/Makefile.am 29 Mar 2008 07:19:02 -0000 1.52
+++ testsuite/Makefile.am 29 Mar 2008 08:37:11 -0000
@@ -561,6 +561,11 @@ check_DATA += ver_test_2.syms
ver_test_2.syms: ver_test_2
readelf -s $< >$@ 2>/dev/null
+check_SCRIPTS += ver_test_4.sh
+check_DATA += ver_test_4.syms
+ver_test_4.syms: ver_test_4.so
+ readelf -s $< >$@ 2>/dev/null
+
endif
if READELF
Index: testsuite/ver_test_4.sh
===================================================================
RCS file: testsuite/ver_test_4.sh
diff -N testsuite/ver_test_4.sh
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ testsuite/ver_test_4.sh 29 Mar 2008 08:37:11 -0000
@@ -0,0 +1,49 @@
+#!/bin/sh
+
+# ver_test_4.sh -- test that version symbol is visible.
+
+# Copyright 2008 Free Software Foundation, Inc.
+# Written by Ian Lance Taylor <iant@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.
+
+# This file goes with ver_matching_def.cc, a C++ source file
+# constructed with several symbols mapped via version_script.map. We
+# run readelf on the resulting shared object and check that each
+# symbol has the correct version.
+
+check()
+{
+ if ! grep -q "$2" "$1"
+ then
+ echo "Did not find expected symbol in $1:"
+ echo " $2"
+ echo ""
+ echo "Actual output below:"
+ cat "$1"
+ exit 1
+ fi
+}
+
+check ver_test_4.syms "t1_2@@VER2"
+check ver_test_4.syms "t2_2@VER1"
+check ver_test_4.syms "t2_2@@VER2"
+check ver_test_4.syms "GLOBAL.*ABS.*VER1"
+check ver_test_4.syms "GLOBAL.*ABS.*VER2"
+
+exit 0