Fix --defsym to copy symbol attributes.

Alan Modra committed a patch to Gnu ld to fix a problem encountered on
PPC where the --defsym option wasn't copying the st_other bits to the
newly-defined symbol.

    https://sourceware.org/ml/binutils/2014-07/msg00094.html

Gold has the same problem, and additionally wasn't copying the symbol type.
This patch fixes both problems, by copying the symbol type, visibility, and
the remaining st_other bits to the new symbol for --defsym=sym1=sym2
assignments.

gold/
	* expression.cc (struct Expression::Expression_eval_info): Add
	new fields type_pointer, vis_pointer, and nonvis_pointer.
	(Expression::eval_maybe_dot): Add type_pointer, vis_pointer, and
	nonvis_pointer parameters. Adjust all calls.
	(Symbol_expression::value): Update type, visibility, and nonvis bits
	in caller.
	* script.cc (Symbol_assignment::sized_finalize): Update type,
	visibility, and remaining st_other bits for new symbol.
	* script.h: (Expression::eval_maybe_dot): Add type_pointer,
	vis_pointer, and nonvis_pointer parameters.
	* symtab.h (Symbol::set_type): New method.

	* testsuite/Makefile.am (defsym_test): New test.
	* testsuite/Makefile.in: Regenerate.
	* testsuite/defsym_test.c: New file.
	* testsuite/defsym_test.sh: New file.
This commit is contained in:
Cary Coutant
2014-07-08 22:34:27 -07:00
parent ecf3e831f7
commit e051745c83
9 changed files with 159 additions and 8 deletions

View File

@@ -34,6 +34,7 @@
#include <string>
#include <vector>
#include "elfcpp.h"
#include "script-sections.h"
namespace gold
@@ -111,6 +112,7 @@ class Expression
bool is_dot_available, uint64_t dot_value,
Output_section* dot_section,
Output_section** result_section, uint64_t* result_alignment,
elfcpp::STT* type, elfcpp::STV* vis, unsigned char* nonvis,
bool is_section_dot_assignment);
// Print the expression to the FILE. This is for debugging.