aboutsummaryrefslogtreecommitdiff
path: root/bfd/elf32-arm.c
diff options
context:
space:
mode:
authorNick Clifton <nickc@redhat.com>1998-09-09 21:25:37 +0000
committerNick Clifton <nickc@redhat.com>1998-09-09 21:25:37 +0000
commita61c93863ec2babadb3458afeb7cb029940b3243 (patch)
tree6b744e49358834ed0e98bc35713a048c08751463 /bfd/elf32-arm.c
parent1891eb9f0d97ba596b727606795d2446b96ba04f (diff)
downloadgdb-a61c93863ec2babadb3458afeb7cb029940b3243.zip
gdb-a61c93863ec2babadb3458afeb7cb029940b3243.tar.gz
gdb-a61c93863ec2babadb3458afeb7cb029940b3243.tar.bz2
fix linker testsuite failure
Diffstat (limited to 'bfd/elf32-arm.c')
-rw-r--r--bfd/elf32-arm.c113
1 files changed, 103 insertions, 10 deletions
diff --git a/bfd/elf32-arm.c b/bfd/elf32-arm.c
index a3afeaa..9d165b9 100644
--- a/bfd/elf32-arm.c
+++ b/bfd/elf32-arm.c
@@ -503,7 +503,6 @@ bfd_elf32_arm_process_before_allocation (abfd, link_info)
for (; sec != NULL; sec = sec->next)
{
-
if (sec->reloc_count == 0)
continue;
@@ -603,7 +602,6 @@ bfd_elf32_arm_process_before_allocation (abfd, link_info)
break;
case R_ARM_THM_PC22:
-
/* This one is a call from thumb code. We look
up the target of the call. If it is not a thumb
target, we insert glue. */
@@ -1050,6 +1048,8 @@ elf32_thumb_to_arm_stub (info, name, input_bfd, output_bfd, input_section,
_bfd_error_handler
(_ (" first occurrence: %s: thumb call to arm"),
bfd_get_filename (input_bfd));
+
+ return false;
}
--my_offset;
@@ -1092,6 +1092,8 @@ elf32_thumb_to_arm_stub (info, name, input_bfd, output_bfd, input_section,
bfd_put_32 (output_bfd,
insert_thumb_branch (tmp, ret_offset),
hit_data - input_section->vma);
+
+ return true;
}
/* Arm code calling a Thumb function */
@@ -1179,6 +1181,8 @@ elf32_arm_to_thumb_stub (info, name, input_bfd, output_bfd, input_section,
bfd_put_32 (output_bfd, tmp, hit_data
- input_section->vma);
+
+ return true;
}
/* Perform a relocation as part of a final link. */
@@ -1304,9 +1308,12 @@ elf32_arm_final_link_relocate (howto, input_bfd, output_bfd,
/* If it's not a call to thumb, assume call to arm */
if (sym_flags != STT_ARM_TFUNC)
{
- elf32_thumb_to_arm_stub (info, sym_name, input_bfd, output_bfd, input_section,
- hit_data, sym_sec, offset, addend, value);
- return bfd_reloc_ok;
+ if (elf32_thumb_to_arm_stub
+ (info, sym_name, input_bfd, output_bfd, input_section,
+ hit_data, sym_sec, offset, addend, value))
+ return bfd_reloc_ok;
+ else
+ return bfd_reloc_dangerous;
}
relocation = value + addend;
@@ -1510,12 +1517,12 @@ elf32_arm_relocate_section (output_bfd, info, input_bfd, input_section,
contents, rel->r_offset,
relocation, rel->r_addend,
info, sec, name,
- (h ? ELF_ST_TYPE (h->type) : ELF_ST_TYPE (sym->st_info)));
-
+ (h ? ELF_ST_TYPE (h->type) :
+ ELF_ST_TYPE (sym->st_info)));
if (r != bfd_reloc_ok)
{
- const char *msg = (const char *) 0;
+ const char * msg = (const char *) 0;
switch (r)
{
@@ -1771,12 +1778,97 @@ elf32_arm_print_private_bfd_data (abfd, ptr)
static int
elf32_arm_get_symbol_type (elf_sym)
- Elf_Internal_Sym *elf_sym;
+ Elf_Internal_Sym * elf_sym;
{
- return ELF_ST_TYPE(elf_sym->st_info);
+ return ELF_ST_TYPE (elf_sym->st_info);
}
+
+
+/* Find the nearest line to a particular section and offset, for error
+ reporting. This code is a duplicate of the code in elf.c, except
+ that it also accepts STT_ARM_TFUNC as a symbol that names a function. */
+
+boolean
+elf32_arm_find_nearest_line
+ (abfd, section, symbols, offset, filename_ptr, functionname_ptr, line_ptr)
+ bfd * abfd;
+ asection * section;
+ asymbol ** symbols;
+ bfd_vma offset;
+ CONST char ** filename_ptr;
+ CONST char ** functionname_ptr;
+ unsigned int * line_ptr;
+{
+ boolean found;
+ const char * filename;
+ asymbol * func;
+ bfd_vma low_func;
+ asymbol ** p;
+
+ if (_bfd_dwarf2_find_nearest_line (abfd, section, symbols, offset,
+ filename_ptr, functionname_ptr,
+ line_ptr))
+ return true;
+
+ if (! _bfd_stab_section_find_nearest_line (abfd, symbols, section, offset,
+ &found, filename_ptr,
+ functionname_ptr, line_ptr,
+ &elf_tdata (abfd)->line_info))
+ return false;
+
+ if (found)
+ return true;
+
+ if (symbols == NULL)
+ return false;
+
+ filename = NULL;
+ func = NULL;
+ low_func = 0;
+
+ for (p = symbols; *p != NULL; p++)
+ {
+ elf_symbol_type *q;
+
+ q = (elf_symbol_type *) *p;
+
+ if (bfd_get_section (&q->symbol) != section)
+ continue;
+
+ switch (ELF_ST_TYPE (q->internal_elf_sym.st_info))
+ {
+ default:
+ break;
+ case STT_FILE:
+ filename = bfd_asymbol_name (&q->symbol);
+ break;
+ case STT_NOTYPE:
+ case STT_FUNC:
+ case STT_ARM_TFUNC:
+ if (q->symbol.section == section
+ && q->symbol.value >= low_func
+ && q->symbol.value <= offset)
+ {
+ func = (asymbol *) q;
+ low_func = q->symbol.value;
+ }
+ break;
+ }
+ }
+
+ if (func == NULL)
+ return false;
+
+ *filename_ptr = filename;
+ *functionname_ptr = bfd_asymbol_name (func);
+ *line_ptr = 0;
+
+ return true;
+}
+
+
#define TARGET_LITTLE_SYM bfd_elf32_littlearm_vec
#define TARGET_LITTLE_NAME "elf32-littlearm"
#define TARGET_BIG_SYM bfd_elf32_bigarm_vec
@@ -1793,6 +1885,7 @@ elf32_arm_get_symbol_type (elf_sym)
#define bfd_elf32_bfd_set_private_flags elf32_arm_set_private_flags
#define bfd_elf32_bfd_print_private_bfd_data elf32_arm_print_private_bfd_data
#define bfd_elf32_bfd_link_hash_table_create elf32_arm_link_hash_table_create
+#define bfd_elf32_find_nearest_line elf32_arm_find_nearest_line
#define elf_backend_get_symbol_type elf32_arm_get_symbol_type
#define elf_symbol_leading_char '_'