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:
parent
4a11f20659
commit
1659f720b0
@ -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,
|
||||
if there is no version info in symbol version section, we will
|
||||
have a run-time problem. */
|
||||
if (h->verinfo.verdef == NULL)
|
||||
have a run-time problem if not linking executable, referenced
|
||||
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);
|
||||
|
||||
|
26
ld/testsuite/ld-elf/pr18718.c
Normal file
26
ld/testsuite/ld-elf/pr18718.c
Normal 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;
|
||||
}
|
@ -529,5 +529,50 @@ if { [istarget *-*-linux*]
|
||||
"pr2404.out" \
|
||||
"-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" \
|
||||
] \
|
||||
]
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user