[bfd]
* elf32-sh.c (sh_elf_relocate_section): Handle R_SH_IMM_*_PCREL relocations. (sh_elf_check_relocs): Likewise. * elf32-sh64.c (elf_backend_merge_symbol_attribute): Define. (sh64_elf_merge_symbol_attribute): New. * elf64-sh64.c (elf_backend_merge_symbol_attribute): Define. (sh64_elf64_merge_symbol_attribute): New. [ld/testsuite] * ld-sh/sh64/rd-sh64.exp: If the test matches *-dso.d, copy the output of linker to the file tmpdir/*-dso.so. * ld-sh/sh64/stobin-0-dso.d: New. * ld-sh/sh64/stobin-1.d: New. * ld-sh/sh64/stobin.s: New. * ld-sh/sh64/stolib.s: New.
This commit is contained in:
parent
3d390fc11a
commit
46e993b970
@ -1,3 +1,14 @@
|
||||
2003-10-15 Kaz Kojima <kkojima@rr.iij4u.or.jp>
|
||||
|
||||
* elf32-sh.c (sh_elf_relocate_section): Handle R_SH_IMM_*_PCREL
|
||||
relocations.
|
||||
(sh_elf_check_relocs): Likewise.
|
||||
|
||||
* elf32-sh64.c (elf_backend_merge_symbol_attribute): Define.
|
||||
(sh64_elf_merge_symbol_attribute): New.
|
||||
* elf64-sh64.c (elf_backend_merge_symbol_attribute): Define.
|
||||
(sh64_elf64_merge_symbol_attribute): New.
|
||||
|
||||
2003-10-14 Kaz Kojima <kkojima@rr.iij4u.or.jp>
|
||||
|
||||
* elf-bfd.h (struct elf_backend_data): New function pointer member
|
||||
|
@ -5081,13 +5081,19 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
|
||||
|
||||
case R_SH_DIR32:
|
||||
case R_SH_REL32:
|
||||
#ifdef INCLUDE_SHMEDIA
|
||||
case R_SH_IMM_LOW16_PCREL:
|
||||
case R_SH_IMM_MEDLOW16_PCREL:
|
||||
case R_SH_IMM_MEDHI16_PCREL:
|
||||
case R_SH_IMM_HI16_PCREL:
|
||||
#endif
|
||||
if (info->shared
|
||||
&& (h == NULL
|
||||
|| ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
|
||||
|| h->root.type != bfd_link_hash_undefweak)
|
||||
&& r_symndx != 0
|
||||
&& (input_section->flags & SEC_ALLOC) != 0
|
||||
&& (r_type != R_SH_REL32
|
||||
&& (r_type == R_SH_DIR32
|
||||
|| !SYMBOL_CALLS_LOCAL (info, h)))
|
||||
{
|
||||
Elf_Internal_Rela outrel;
|
||||
@ -5140,6 +5146,17 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
|
||||
outrel.r_addend
|
||||
= bfd_get_32 (input_bfd, contents + rel->r_offset);
|
||||
}
|
||||
#ifdef INCLUDE_SHMEDIA
|
||||
else if (r_type == R_SH_IMM_LOW16_PCREL
|
||||
|| r_type == R_SH_IMM_MEDLOW16_PCREL
|
||||
|| r_type == R_SH_IMM_MEDHI16_PCREL
|
||||
|| r_type == R_SH_IMM_HI16_PCREL)
|
||||
{
|
||||
BFD_ASSERT (h != NULL && h->dynindx != -1);
|
||||
outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
|
||||
outrel.r_addend = addend;
|
||||
}
|
||||
#endif
|
||||
else
|
||||
{
|
||||
/* h->dynindx may be -1 if this symbol was marked to
|
||||
@ -6655,6 +6672,12 @@ sh_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec,
|
||||
|
||||
case R_SH_DIR32:
|
||||
case R_SH_REL32:
|
||||
#ifdef INCLUDE_SHMEDIA
|
||||
case R_SH_IMM_LOW16_PCREL:
|
||||
case R_SH_IMM_MEDLOW16_PCREL:
|
||||
case R_SH_IMM_MEDHI16_PCREL:
|
||||
case R_SH_IMM_HI16_PCREL:
|
||||
#endif
|
||||
if (h != NULL && ! info->shared)
|
||||
{
|
||||
h->elf_link_hash_flags |= ELF_LINK_NON_GOT_REF;
|
||||
@ -6772,7 +6795,14 @@ sh_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec,
|
||||
}
|
||||
|
||||
p->count += 1;
|
||||
if (r_type == R_SH_REL32)
|
||||
if (r_type == R_SH_REL32
|
||||
#ifdef INCLUDE_SHMEDIA
|
||||
|| r_type == R_SH_IMM_LOW16_PCREL
|
||||
|| r_type == R_SH_IMM_MEDLOW16_PCREL
|
||||
|| r_type == R_SH_IMM_MEDHI16_PCREL
|
||||
|| r_type == R_SH_IMM_HI16_PCREL
|
||||
#endif
|
||||
)
|
||||
p->pc_count += 1;
|
||||
}
|
||||
|
||||
|
@ -85,6 +85,7 @@ static void sh64_find_section_for_address
|
||||
#define elf_backend_add_symbol_hook sh64_elf_add_symbol_hook
|
||||
#define elf_backend_link_output_symbol_hook \
|
||||
sh64_elf_link_output_symbol_hook
|
||||
#define elf_backend_merge_symbol_attribute sh64_elf_merge_symbol_attribute
|
||||
#define elf_backend_final_write_processing sh64_elf_final_write_processing
|
||||
#define elf_backend_section_from_shdr sh64_backend_section_from_shdr
|
||||
#define elf_backend_special_sections sh64_elf_special_sections
|
||||
@ -735,6 +736,27 @@ sh64_elf_final_write_processing (bfd *abfd,
|
||||
}
|
||||
}
|
||||
|
||||
/* Merge non visibility st_other attribute when the symbol comes from
|
||||
a dynamic object. */
|
||||
static void
|
||||
sh64_elf_merge_symbol_attribute (struct elf_link_hash_entry *h,
|
||||
const Elf_Internal_Sym *isym,
|
||||
bfd_boolean definition,
|
||||
bfd_boolean dynamic)
|
||||
{
|
||||
if (isym->st_other != 0 && dynamic)
|
||||
{
|
||||
unsigned char other;
|
||||
|
||||
/* Take the balance of OTHER from the definition. */
|
||||
other = (definition ? isym->st_other : h->other);
|
||||
other &= ~ ELF_ST_VISIBILITY (-1);
|
||||
h->other = other | ELF_ST_VISIBILITY (h->other);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
static struct bfd_elf_special_section const sh64_elf_special_sections[]=
|
||||
{
|
||||
{ ".cranges", 8, 0, SHT_PROGBITS, 0 },
|
||||
|
@ -4118,6 +4118,27 @@ sh64_elf64_finish_dynamic_sections (bfd *output_bfd,
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/* Merge non visibility st_other attribute when the symbol comes from
|
||||
a dynamic object. */
|
||||
static void
|
||||
sh64_elf64_merge_symbol_attribute (struct elf_link_hash_entry *h,
|
||||
const Elf_Internal_Sym *isym,
|
||||
bfd_boolean definition,
|
||||
bfd_boolean dynamic)
|
||||
{
|
||||
if (isym->st_other != 0 && dynamic)
|
||||
{
|
||||
unsigned char other;
|
||||
|
||||
/* Take the balance of OTHER from the definition. */
|
||||
other = (definition ? isym->st_other : h->other);
|
||||
other &= ~ ELF_ST_VISIBILITY (-1);
|
||||
h->other = other | ELF_ST_VISIBILITY (h->other);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
static struct bfd_elf_special_section const sh64_elf64_special_sections[]=
|
||||
{
|
||||
{ ".cranges", 8, 0, SHT_PROGBITS, 0 },
|
||||
@ -4164,6 +4185,9 @@ static struct bfd_elf_special_section const sh64_elf64_special_sections[]=
|
||||
#define elf_backend_link_output_symbol_hook \
|
||||
sh64_elf64_link_output_symbol_hook
|
||||
|
||||
#define elf_backend_merge_symbol_attribute \
|
||||
sh64_elf64_merge_symbol_attribute
|
||||
|
||||
#define elf_backend_final_write_processing \
|
||||
sh64_elf64_final_write_processing
|
||||
|
||||
|
@ -1,3 +1,12 @@
|
||||
2003-10-15 Kaz Kojima <kkojima@rr.iij4u.or.jp>
|
||||
|
||||
* ld-sh/sh64/rd-sh64.exp: If the test matches *-dso.d, copy
|
||||
the output of linker to the file tmpdir/*-dso.so.
|
||||
* ld-sh/sh64/stobin-0-dso.d: New.
|
||||
* ld-sh/sh64/stobin-1.d: New.
|
||||
* ld-sh/sh64/stobin.s: New.
|
||||
* ld-sh/sh64/stolib.s: New.
|
||||
|
||||
2003-10-13 Richard Sandiford <rsandifo@redht.com>
|
||||
|
||||
* ld-mips-elf/multi-got-1.d (RELSZ): Don't include the size of the
|
||||
|
@ -27,4 +27,15 @@ foreach sh64test $rd_test_list {
|
||||
# We need to strip the ".d", but can leave the dirname.
|
||||
verbose [file rootname $sh64test]
|
||||
run_dump_test [file rootname $sh64test]
|
||||
if [string match $srcdir/$subdir/*-dso.d $sh64test] {
|
||||
# Copy the output of the DSO-createing test to .so file.
|
||||
# Notice that a DSO-creating test must preceed the tests
|
||||
# which need that DSO in sort-order by name.
|
||||
set cmd "cp tmpdir/dump \
|
||||
tmpdir/[file rootname [file tail $sh64test]].so"
|
||||
send_log "$cmd\n"
|
||||
set cmdret [catch "exec $cmd" comp_output]
|
||||
send_log "$comp_output\n"
|
||||
# FIXME: What if it fails? Need we do something?
|
||||
}
|
||||
}
|
||||
|
9
ld/testsuite/ld-sh/sh64/stobin-0-dso.d
Normal file
9
ld/testsuite/ld-sh/sh64/stobin-0-dso.d
Normal file
@ -0,0 +1,9 @@
|
||||
#source: stolib.s
|
||||
#as: --abi=32 --isa=SHmedia
|
||||
#ld: -shared -mshelf32
|
||||
#objdump: -drj.text
|
||||
#target: sh64-*-elf
|
||||
|
||||
.*: +file format elf32-sh64.*
|
||||
|
||||
#pass
|
15
ld/testsuite/ld-sh/sh64/stobin-1.d
Normal file
15
ld/testsuite/ld-sh/sh64/stobin-1.d
Normal file
@ -0,0 +1,15 @@
|
||||
#source: stobin.s
|
||||
#as: --abi=32 --isa=SHmedia
|
||||
#ld: -mshelf32 tmpdir/stobin-0-dso.so
|
||||
#objdump: -drj.text
|
||||
#target: sh64-*-elf
|
||||
|
||||
.*: +file format elf32-sh64.*
|
||||
|
||||
Disassembly of section \.text:
|
||||
|
||||
0+[0-9a-f]+ <start>:
|
||||
[0-9a-f]+: cffffd90 movi -1,r25
|
||||
[0-9a-f]+: cbfee590 shori 65465,r25 ! 0xffffffb9 .*
|
||||
[0-9a-f]+: 6bf56600 ptrel/l r25,tr0
|
||||
[0-9a-f]+: 4401fff0 blink tr0,r63
|
5
ld/testsuite/ld-sh/sh64/stobin.s
Normal file
5
ld/testsuite/ld-sh/sh64/stobin.s
Normal file
@ -0,0 +1,5 @@
|
||||
.text
|
||||
.globl start
|
||||
start:
|
||||
pt bar, tr0
|
||||
blink tr0, r63
|
7
ld/testsuite/ld-sh/sh64/stolib.s
Normal file
7
ld/testsuite/ld-sh/sh64/stolib.s
Normal file
@ -0,0 +1,7 @@
|
||||
.text
|
||||
.globl bar
|
||||
.type bar,@function
|
||||
bar:
|
||||
ptabs r18, tr0
|
||||
blink tr0, r63
|
||||
.Lfe_bar: .size bar,.Lfe_bar-X
|
Loading…
Reference in New Issue
Block a user