Skip missing symbol version section check for executable

Missing symbol version section is a run-time problem only if it will
be referenced dynamically at run-time.  We should skip the check for
locally defined symbol, which isn't referenced by shared library, when
linking executable.

bfd/

	PR ld/18718
	* elflink.c (elf_link_output_extsym): Check symbol version
	section check only if not linking executable, the symbol is
	referenced by shared library or not locally defined.

ld/testsuite/

	PR ld/18718
	* ld-elf/pr18718.c: New file.
	* ld-elf/shared.exp: Run tests for PR ld/18718.
This commit is contained in:
H.J. Lu
2015-07-25 07:56:18 -07:00
parent 4a11f20659
commit 1659f720b0
3 changed files with 77 additions and 2 deletions

View File

@ -9217,8 +9217,12 @@ elf_link_output_extsym (struct bfd_hash_entry *bh, void *data)
/* Since there is no version information in the dynamic string, /* Since there is no version information in the dynamic string,
if there is no version info in symbol version section, we will if there is no version info in symbol version section, we will
have a run-time problem. */ have a run-time problem if not linking executable, referenced
if (h->verinfo.verdef == NULL) by shared library, or not locally defined. */
if (h->verinfo.verdef == NULL
&& (!flinfo->info->executable
|| h->ref_dynamic
|| !h->def_regular))
{ {
char *p = strrchr (h->root.root.string, ELF_VER_CHR); char *p = strrchr (h->root.root.string, ELF_VER_CHR);

View File

@ -0,0 +1,26 @@
#include <stdio.h>
#include <bfd_stdint.h>
extern void foo (void);
void
new_foo (void)
{
}
__asm__(".symver new_foo, foo@@VERS_2.0");
__attribute__ ((noinline, noclone))
int
bar (void)
{
return (intptr_t) &foo == 0x12345678 ? 1 : 0;
}
int
main(void)
{
bar ();
printf("PASS\n");
return 0;
}

View File

@ -529,5 +529,50 @@ if { [istarget *-*-linux*]
"pr2404.out" \ "pr2404.out" \
"-fPIE" \ "-fPIE" \
] \ ] \
[list \
"Run pr18718" \
"" \
"" \
{ pr18718.c } \
"pr18718" \
"pass.out" \
"-I../bfd" \
] \
[list \
"Run pr18718 with PIE (1)" \
"-pie" \
"" \
{ pr18718.c } \
"pr18718pie1" \
"pass.out" \
"-fPIE -I../bfd" \
] \
[list \
"Run pr18718 with PIE (2)" \
"" \
"" \
{ pr18718.c } \
"pr18718pie2" \
"pass.out" \
"-fPIE -I../bfd" \
] \
[list \
"Run pr18718 with PIC (1)" \
"" \
"" \
{ pr18718.c } \
"pr18718pic1" \
"pass.out" \
"-fPIC -I../bfd" \
] \
[list \
"Run pr18718 with PIC (2)" \
"-pie" \
"" \
{ pr18718.c } \
"pr18718pic2" \
"pass.out" \
"-fPIC -I../bfd" \
] \
] ]
} }