binutils-gdb/gold/testsuite/plugin_pr22868_b.c
Cary Coutant 0b7a4aa6ba Fix case where IR file provides symbol visibility but replacement file does not.
In PR 22868, two IR files provide conflicting visibility for a symbol.
When a def with PROTECTED visibility is seen after a def with DEFAULT
visibility, gold does not override the visibility. Later, if the
replacement object define the symbol with DEFAULT visibility, the symbol
remains DEFAULT. This was caused by a recent change to allow multiply-defined
absolute symbols, combined with the fact that the plugin framework was using
SHN_ABS as the section index for placeholder symbols. The solution is to
use a real (but arbitrary) section index.

gold/
	PR gold/22868
	* plugin.cc (Sized_pluginobj::do_add_symbols): Use a real section
	index instead of SHN_ABS for defined symbols.
	* testsuite/Makefile.am (plugin_pr22868): New test case.
	* testsuite/Makefile.in: Regenerate
	* testsuite/plugin_pr22868.sh: New test script.
	* testsuite/plugin_pr22868_a.c: New source file.
	* testsuite/plugin_pr22868_b.c: New source file.
2018-03-26 10:54:45 -07:00

40 lines
1.3 KiB
C

/* plugin_pr22868_b_ir.c -- a test case for the plugin API with GC.
Copyright (C) 2018 Free Software Foundation, Inc.
Written by Cary Coutant <ccoutant@gmail.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 is compiled with -DIR to generate the .syms file,
and without -DIR for use as the replacement object.
The .syms file declares foo with protected visibility, but
the replacement file does not. */
#ifdef IR
#define PROTECTED __attribute__ (( visibility ("protected") ))
#else
#define PROTECTED
#endif
int foo(int i) __attribute__ (( weak )) PROTECTED;
int foo(int i)
{
return i + 1;
}