Index: bfd/elf32-arm.c =================================================================== RCS file: /cvs/src/src/bfd/elf32-arm.c,v retrieving revision 1.10 diff -u -p -r1.10 elf32-arm.c --- bfd/elf32-arm.c 19 Nov 2004 11:58:02 -0000 1.10 +++ bfd/elf32-arm.c 19 Nov 2004 14:34:15 -0000 @@ -5662,6 +5662,82 @@ elf32_arm_symbol_processing (bfd *abfd A elfsym->symbol.flags |= BSF_FUNCTION; } + +/* Mangle thumb function symbols as we read them in. */ + +static void +elf32_arm_swap_symbol_in (bfd * abfd, + const void *psrc, + const void *pshn, + Elf_Internal_Sym *dst) +{ + bfd_elf32_swap_symbol_in (abfd, psrc, pshn, dst); + + /* New EABI objects mark thumb function symbols by setting the low bit of + the address. Turn these into STT_ARM_TFUNC. */ + if (ELF_ST_TYPE (dst->st_info) == STT_FUNC + && (dst->st_value & 1)) + { + dst->st_info = ELF_ST_INFO (ELF_ST_BIND (dst->st_info), STT_ARM_TFUNC); + dst->st_value &= ~(bfd_vma) 1; + } +} + + +/* Mangle thumb function symbols as we write them out. */ + +static void +elf32_arm_swap_symbol_out (bfd *abfd, + const Elf_Internal_Sym *src, + void *cdst, + void *shndx) +{ + Elf_Internal_Sym newsym; + + /* We convert STT_ARM_TFUNC symbols into STT_FUNC with the low bit + of the address set, as per the new EABI. We do this unconditionally + because objcopy does not set the elf header flags until after + it writes out the symbol table. */ + if (ELF_ST_TYPE (src->st_info) == STT_ARM_TFUNC) + { + newsym = *src; + newsym.st_info = ELF_ST_INFO (ELF_ST_BIND (src->st_info), STT_FUNC); + newsym.st_value |= 1; + + src = &newsym; + } + bfd_elf32_swap_symbol_out (abfd, src, cdst, shndx); +} + +/* We use this to override swap_symbol_in and swap_symbol_out. */ +const struct elf_size_info elf32_arm_size_info = { + sizeof (Elf32_External_Ehdr), + sizeof (Elf32_External_Phdr), + sizeof (Elf32_External_Shdr), + sizeof (Elf32_External_Rel), + sizeof (Elf32_External_Rela), + sizeof (Elf32_External_Sym), + sizeof (Elf32_External_Dyn), + sizeof (Elf_External_Note), + 4, + 1, + 32, 2, + ELFCLASS32, EV_CURRENT, + bfd_elf32_write_out_phdrs, + bfd_elf32_write_shdrs_and_ehdr, + bfd_elf32_write_relocs, + elf32_arm_swap_symbol_in, + elf32_arm_swap_symbol_out, + bfd_elf32_slurp_reloc_table, + bfd_elf32_slurp_symbol_table, + bfd_elf32_swap_dyn_in, + bfd_elf32_swap_dyn_out, + bfd_elf32_swap_reloc_in, + bfd_elf32_swap_reloc_out, + bfd_elf32_swap_reloca_in, + bfd_elf32_swap_reloca_out +}; + #define ELF_ARCH bfd_arch_arm #define ELF_MACHINE_CODE EM_ARM #ifdef __QNXTARGET__ @@ -5701,6 +5777,7 @@ elf32_arm_symbol_processing (bfd *abfd A #define elf_backend_final_write_processing elf32_arm_final_write_processing #define elf_backend_copy_indirect_symbol elf32_arm_copy_indirect_symbol #define elf_backend_symbol_processing elf32_arm_symbol_processing +#define elf_backend_size_info elf32_arm_size_info #define elf_backend_can_refcount 1 #define elf_backend_can_gc_sections 1 Index: ld/testsuite/ld-arm/mixed-lib.sym =================================================================== RCS file: /cvs/src/src/ld/testsuite/ld-arm/mixed-lib.sym,v retrieving revision 1.1 diff -u -p -r1.1 mixed-lib.sym --- ld/testsuite/ld-arm/mixed-lib.sym 17 Nov 2004 17:50:27 -0000 1.1 +++ ld/testsuite/ld-arm/mixed-lib.sym 19 Nov 2004 14:34:16 -0000 @@ -3,7 +3,7 @@ Symbol table for image: Num Buc: Value Size Type Bind Vis Ndx Name .. ..: ........ 0 NOTYPE GLOBAL DEFAULT ABS _edata .. ..: .......0 20 FUNC GLOBAL DEFAULT 6 lib_func1 - .. ..: .......0 2 THUMB_FUNC GLOBAL DEFAULT 6 lib_func2 + .. ..: .......1 2 FUNC GLOBAL DEFAULT 6 lib_func2 .. ..: ........ 0 NOTYPE GLOBAL DEFAULT ABS _bss_end__ .. ..: ........ 0 OBJECT GLOBAL DEFAULT ABS _DYNAMIC .. ..: ........ 0 NOTYPE GLOBAL DEFAULT ABS __bss_end__