2008-03-16  H.J. Lu  <hongjiu.lu@intel.com>

	PR ld/5789
	PR ld/5943
	* elf32-i386.c  (elf_i386_relocate_section): Issue an error
	for R_386_GOTOFF relocaton against undefined hidden/internal
	symbols when building a shared object.

	* elf64-x86-64.c (elf64_x86_64_relocate_section): Issue an
	error for R_X86_64_PC8/R_X86_64_PC16/R_X86_64_PC32
	relocaton against undefined hidden/internal symbols when
	building a shared object.
	(elf64_x86_64_finish_dynamic_symbol): Return FALSE when symbol
	is referenced locally, but isn't defined in a regular file.

ld/testsuite/

2008-03-16  H.J. Lu  <hongjiu.lu@intel.com>

	PR ld/5789
	PR ld/5943
	* ld-i386/hidden1.d: New.
	* ld-i386/hidden1.s: Likewise.
	* ld-i386/hidden2.d: Likewise.
	* ld-i386/hidden2.s: Likewise.
	* ld-i386/hidden3.d: Likewise.
	* ld-i386/hidden4.s: Likewise.
	* ld-i386/protected1.d: Likewise.
	* ld-i386/protected1.s: Likewise.
	* ld-i386/protected2.d: Likewise.
	* ld-i386/protected2.s: Likewise.
	* ld-i386/protected3.d: Likewise.
	* ld-i386/protected3.s: Likewise.
	* ld-x86-64/hidden1.d: Likewise.
	* ld-x86-64/hidden1.s: Likewise.
	* ld-x86-64/hidden2.d: Likewise.
	* ld-x86-64/hidden2.s: Likewise.
	* ld-x86-64/hidden3.d: Likewise.
	* ld-x86-64/hidden3.s: Likewise.
	* ld-x86-64/protected1.d: Likewise.
	* ld-x86-64/protected1.s: Likewise.
	* ld-x86-64/protected2.d: Likewise.
	* ld-x86-64/protected2.s: Likewise.
	* ld-x86-64/protected3.d: Likewise.
	* ld-x86-64/protected3.s: Likewise.

	* ld-i386/i386.exp: Run hidden1, hidden2, hidden3, protected1,
	protected2 and protected3.
	* ld-x86-64/x86-64.exp: Likewise.
This commit is contained in:
H.J. Lu
2008-03-16 22:26:23 +00:00
parent f01be29bbc
commit 41bed6dd8a
30 changed files with 390 additions and 32 deletions

View File

@ -1,3 +1,18 @@
2008-03-16 H.J. Lu <hongjiu.lu@intel.com>
PR ld/5789
PR ld/5943
* elf32-i386.c (elf_i386_relocate_section): Issue an error
for R_386_GOTOFF relocaton against undefined hidden/internal
symbols when building a shared object.
* elf64-x86-64.c (elf64_x86_64_relocate_section): Issue an
error for R_X86_64_PC8/R_X86_64_PC16/R_X86_64_PC32
relocaton against undefined hidden/internal symbols when
building a shared object.
(elf64_x86_64_finish_dynamic_symbol): Return FALSE when symbol
is referenced locally, but isn't defined in a regular file.
2008-03-15 H.J. Lu <hongjiu.lu@intel.com>
* bfd-in.h (BFD_NO_FLAGS, HAS_RELOC, EXEC_P, HAS_LINENO,

View File

@ -2753,19 +2753,46 @@ elf_i386_relocate_section (bfd *output_bfd,
/* Check to make sure it isn't a protected function symbol
for shared library since it may not be local when used
as function address. */
if (info->shared
&& !info->executable
&& h
&& h->def_regular
&& h->type == STT_FUNC
&& ELF_ST_VISIBILITY (h->other) == STV_PROTECTED)
as function address. We also need to make sure that a
symbol is defined locally. */
if (info->shared && h)
{
(*_bfd_error_handler)
(_("%B: relocation R_386_GOTOFF against protected function `%s' can not be used when making a shared object"),
input_bfd, h->root.root.string);
bfd_set_error (bfd_error_bad_value);
return FALSE;
if (!h->def_regular)
{
const char *v;
switch (ELF_ST_VISIBILITY (h->other))
{
case STV_HIDDEN:
v = _("hidden symbol");
break;
case STV_INTERNAL:
v = _("internal symbol");
break;
case STV_PROTECTED:
v = _("protected symbol");
break;
default:
v = _("symbol");
break;
}
(*_bfd_error_handler)
(_("%B: relocation R_386_GOTOFF against undefined %s `%s' can not be used when making a shared object"),
input_bfd, v, h->root.root.string);
bfd_set_error (bfd_error_bad_value);
return FALSE;
}
else if (!info->executable
&& h->type == STT_FUNC
&& ELF_ST_VISIBILITY (h->other) == STV_PROTECTED)
{
(*_bfd_error_handler)
(_("%B: relocation R_386_GOTOFF against protected function `%s' can not be used when making a shared object"),
input_bfd, h->root.root.string);
bfd_set_error (bfd_error_bad_value);
return FALSE;
}
}
/* Note that sgot is not involved in this

View File

@ -2595,30 +2595,63 @@ elf64_x86_64_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
case R_X86_64_PC16:
case R_X86_64_PC32:
if (info->shared
&& !SYMBOL_REFERENCES_LOCAL (info, h)
&& (input_section->flags & SEC_ALLOC) != 0
&& (input_section->flags & SEC_READONLY) != 0
&& (!h->def_regular
|| r_type != R_X86_64_PC32
|| h->type != STT_FUNC
|| ELF_ST_VISIBILITY (h->other) != STV_PROTECTED
|| !is_32bit_relative_branch (contents,
rel->r_offset)))
&& h != NULL)
{
if (h->def_regular
&& r_type == R_X86_64_PC32
&& h->type == STT_FUNC
&& ELF_ST_VISIBILITY (h->other) == STV_PROTECTED)
(*_bfd_error_handler)
(_("%B: relocation R_X86_64_PC32 against protected function `%s' can not be used when making a shared object"),
input_bfd, h->root.root.string);
bfd_boolean fail = FALSE;
bfd_boolean branch
= (r_type == R_X86_64_PC32
&& is_32bit_relative_branch (contents, rel->r_offset));
if (SYMBOL_REFERENCES_LOCAL (info, h))
{
/* Symbol is referenced locally. Make sure it is
defined locally or for a branch. */
fail = !h->def_regular && !branch;
}
else
(*_bfd_error_handler)
(_("%B: relocation %s against `%s' can not be used when making a shared object; recompile with -fPIC"),
input_bfd, x86_64_elf_howto_table[r_type].name,
h->root.root.string);
bfd_set_error (bfd_error_bad_value);
return FALSE;
{
/* Symbol isn't referenced locally. We only allow
branch to symbol with non-default visibility. */
fail = (!branch
|| ELF_ST_VISIBILITY (h->other) == STV_DEFAULT);
}
if (fail)
{
const char *fmt;
const char *v;
const char *pic = "";
switch (ELF_ST_VISIBILITY (h->other))
{
case STV_HIDDEN:
v = _("hidden symbol");
break;
case STV_INTERNAL:
v = _("internal symbol");
break;
case STV_PROTECTED:
v = _("protected symbol");
break;
default:
v = _("symbol");
pic = _("; recompile with -fPIC");
break;
}
if (h->def_regular)
fmt = _("%B: relocation %s against %s `%s' can not be used when making a shared object%s");
else
fmt = _("%B: relocation %s against undefined %s `%s' can not be used when making a shared object%s");
(*_bfd_error_handler) (fmt, input_bfd,
x86_64_elf_howto_table[r_type].name,
v, h->root.root.string, pic);
bfd_set_error (bfd_error_bad_value);
return FALSE;
}
}
/* Fall through. */
@ -3343,6 +3376,8 @@ elf64_x86_64_finish_dynamic_symbol (bfd *output_bfd,
if (info->shared
&& SYMBOL_REFERENCES_LOCAL (info, h))
{
if (!h->def_regular)
return FALSE;
BFD_ASSERT((h->got.offset & 1) != 0);
rela.r_info = ELF64_R_INFO (0, R_X86_64_RELATIVE);
rela.r_addend = (h->root.u.def.value

View File

@ -1,3 +1,36 @@
2008-03-16 H.J. Lu <hongjiu.lu@intel.com>
PR ld/5789
PR ld/5943
* ld-i386/hidden1.d: New.
* ld-i386/hidden1.s: Likewise.
* ld-i386/hidden2.d: Likewise.
* ld-i386/hidden2.s: Likewise.
* ld-i386/hidden3.d: Likewise.
* ld-i386/hidden4.s: Likewise.
* ld-i386/protected1.d: Likewise.
* ld-i386/protected1.s: Likewise.
* ld-i386/protected2.d: Likewise.
* ld-i386/protected2.s: Likewise.
* ld-i386/protected3.d: Likewise.
* ld-i386/protected3.s: Likewise.
* ld-x86-64/hidden1.d: Likewise.
* ld-x86-64/hidden1.s: Likewise.
* ld-x86-64/hidden2.d: Likewise.
* ld-x86-64/hidden2.s: Likewise.
* ld-x86-64/hidden3.d: Likewise.
* ld-x86-64/hidden3.s: Likewise.
* ld-x86-64/protected1.d: Likewise.
* ld-x86-64/protected1.s: Likewise.
* ld-x86-64/protected2.d: Likewise.
* ld-x86-64/protected2.s: Likewise.
* ld-x86-64/protected3.d: Likewise.
* ld-x86-64/protected3.s: Likewise.
* ld-i386/i386.exp: Run hidden1, hidden2, hidden3, protected1,
protected2 and protected3.
* ld-x86-64/x86-64.exp: Likewise.
2008-03-14 Alan Modra <amodra@bigpond.net.au>
* ld-spu/ovl2.s: Make setjmp global.

View File

@ -0,0 +1,3 @@
#as: --32
#ld: -shared -melf_i386
#error: .*relocation R_386_GOTOFF against undefined hidden symbol `foo' can not be used when making a shared object

View File

@ -0,0 +1,9 @@
.text
.globl bar
.type bar, @function
bar:
leal foo@GOTOFF(%ecx), %eax
ret
.size bar, .-bar
.weak foo
.hidden foo

View File

@ -0,0 +1,13 @@
#as: --32
#ld: -shared -melf_i386
#objdump: -drw
.*: +file format .*
Disassembly of section .text:
[a-f0-9]+ <bar>:
[ ]*[a-f0-9]+: e8 cf fe ff ff call 0 <bar-0x[a-f0-9]+>
[ ]*[a-f0-9]+: c3 ret
#pass

View File

@ -0,0 +1,9 @@
.text
.globl bar
.type bar, @function
bar:
call foo
ret
.size bar, .-bar
.weak foo
.hidden foo

View File

@ -0,0 +1,3 @@
#as: --32
#ld: -shared -melf_i386
#error: .*relocation R_386_GOTOFF against undefined hidden symbol `foo' can not be used when making a shared object

View File

@ -0,0 +1,8 @@
.text
.globl bar
.type bar, @function
bar:
leal foo@GOTOFF(%ecx), %eax
ret
.size bar, .-bar
.hidden foo

View File

@ -132,3 +132,9 @@ run_dump_test "tlsie2"
run_dump_test "tlsie3"
run_dump_test "tlsie4"
run_dump_test "tlsie5"
run_dump_test "hidden1"
run_dump_test "hidden2"
run_dump_test "hidden3"
run_dump_test "protected1"
run_dump_test "protected2"
run_dump_test "protected3"

View File

@ -0,0 +1,3 @@
#as: --32
#ld: -shared -melf_i386
#error: .*relocation R_386_GOTOFF against protected function `foo' can not be used when making a shared object

View File

@ -0,0 +1,13 @@
.text
.globl foo
.protected foo
.type foo, @function
foo:
ret
.size foo, .-foo
.globl bar
.type bar, @function
bar:
leal foo@GOTOFF(%ecx), %eax
ret
.size bar, .-bar

View File

@ -0,0 +1,16 @@
#as: --32
#ld: -shared -melf_i386
#objdump: -drw
.*: +file format .*
Disassembly of section .text:
0+[a-f0-9]+ <foo>:
[ ]*[a-f0-9]+: c3 ret
0+[a-f0-9]+ <bar>:
[ ]*[a-f0-9]+: e8 fa ff ff ff call [a-f0-9]+ <foo>
[ ]*[a-f0-9]+: c3 ret
#pass

View File

@ -0,0 +1,13 @@
.text
.globl foo
.protected foo
.type foo, @function
foo:
ret
.size foo, .-foo
.globl bar
.type bar, @function
bar:
call foo
ret
.size bar, .-bar

View File

@ -0,0 +1,13 @@
#as: --32
#ld: -shared -melf_i386
#objdump: -drw
.*: +file format .*
Disassembly of section .text:
0+[a-f0-9]+ <bar>:
[ ]*[a-f0-9]+: 8b 81 0c 00 00 00 mov 0x[a-f0-9]+\(%ecx\),%eax
[ ]*[a-f0-9]+: c3 ret
#pass

View File

@ -0,0 +1,15 @@
.protected foo
.globl foo
.data
.align 4
.type foo, @object
.size foo, 4
foo:
.long 1
.text
.globl bar
.type bar, @function
bar:
movl foo@GOTOFF(%ecx), %eax
ret
.size bar, .-bar

View File

@ -0,0 +1,3 @@
#as: --64
#ld: -shared -melf_x86_64
#error: .*relocation R_X86_64_PC32 against undefined hidden symbol `foo' can not be used when making a shared object

View File

@ -0,0 +1,9 @@
.text
.globl bar
.type bar, @function
bar:
leaq foo(%rip), %rax
ret
.size bar, .-bar
.weak foo
.hidden foo

View File

@ -0,0 +1,13 @@
#as: --64
#ld: -shared -melf_x86_64
#objdump: -drw
.*: +file format .*
Disassembly of section .text:
[a-f0-9]+ <bar>:
[ ]*[a-f0-9]+: e8 33 fe ff ff callq 0 <bar-0x[a-f0-9]+>
[ ]*[a-f0-9]+: c3 retq
#pass

View File

@ -0,0 +1,9 @@
.text
.globl bar
.type bar, @function
bar:
call foo
ret
.size bar, .-bar
.weak foo
.hidden foo

View File

@ -0,0 +1,3 @@
#as: --64
#ld: -shared -melf_x86_64
#error: .*relocation R_X86_64_PC32 against undefined hidden symbol `foo' can not be used when making a shared object

View File

@ -0,0 +1,8 @@
.text
.globl bar
.type bar, @function
bar:
leaq foo(%rip), %rax
ret
.size bar, .-bar
.hidden foo

View File

@ -0,0 +1,3 @@
#as: --64
#ld: -shared -melf_x86_64
#error: .*relocation R_X86_64_PC32 against protected symbol `foo' can not be used when making a shared object

View File

@ -0,0 +1,13 @@
.text
.globl foo
.protected foo
.type foo, @function
foo:
ret
.size foo, .-foo
.globl bar
.type bar, @function
bar:
leaq foo(%rip), %rax
ret
.size bar, .-bar

View File

@ -0,0 +1,16 @@
#as: --64
#ld: -shared -melf_x86_64
#objdump: -drw
.*: +file format .*
Disassembly of section .text:
0+[a-f0-9]+ <foo>:
[ ]*[a-f0-9]+: c3 retq
0+[a-f0-9]+ <bar>:
[ ]*[a-f0-9]+: e8 fa ff ff ff callq [a-f0-9]+ <foo>
[ ]*[a-f0-9]+: c3 retq
#pass

View File

@ -0,0 +1,13 @@
.text
.globl foo
.protected foo
.type foo, @function
foo:
ret
.size foo, .-foo
.globl bar
.type bar, @function
bar:
call foo
ret
.size bar, .-bar

View File

@ -0,0 +1,13 @@
#as: --64
#ld: -shared -melf_x86_64
#objdump: -drw
.*: +file format .*
Disassembly of section .text:
0+[a-f0-9]+ <bar>:
[ ]*[a-f0-9]+: 8b 05 ce 00 20 00 mov 0x[a-f0-9]+\(%rip\),%eax # [a-f0-9]+ <foo>
[ ]*[a-f0-9]+: c3 retq
#pass

View File

@ -0,0 +1,15 @@
.protected foo
.globl foo
.data
.align 4
.type foo, @object
.size foo, 4
foo:
.long 1
.text
.globl bar
.type bar, @function
bar:
movl foo(%rip), %eax
ret
.size bar, .-bar

View File

@ -86,3 +86,9 @@ run_dump_test "tlsgd2"
run_dump_test "tlsgd3"
run_dump_test "tlsie2"
run_dump_test "tlsie3"
run_dump_test "hidden1"
run_dump_test "hidden2"
run_dump_test "hidden3"
run_dump_test "protected1"
run_dump_test "protected2"
run_dump_test "protected3"