From cd49363b8ae1725522ea29ccc0dda7b138f3d5aa Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Tue, 30 Oct 2012 12:44:53 +0000 Subject: bfd: * elf32-arm.c (elf32_arm_print_private_bfd_data): Recognise and display the new ARM hard-float/soft-float ABI flags for EABI_VER5 (elf32_arm_post_process_headers): Add the hard-float/soft-float ABI flag as appropriate for ET_DYN/ET_EXEC in EABI_VER5. binutils: * readelf.c (decode_ARM_machine_flags): Recognise and display the new ARM hard-float/soft-float ABI flags for EABI_VER5. Split out the code for EABI_VER4 and EABI_VER5 to allow this. elfcpp: * arm.h: New enum for EABI soft- and hard-float flags. gold: * gold.cc (Target_arm::do_adjust_elf_header): Add the hard-float/soft-float ABI flag as appropriate for ET_DYN/ET_EXEC in EABI_VER5. include: * elf/arm.h (EF_ARM_ABI_FLOAT_SOFT): New define. (EF_ARM_ABI_FLOAT_HARD): Likewise. ld/testsuite: * ld-arm/eabi-hard-float.s: New test source. * ld-arm/eabi-soft-float.s: New test source. * ld-arm/eabi-hard-float.d: New test. * ld-arm/eabi-soft-float.d: New test. * ld-arm/eabi-soft-float-ABI4.d: New test. * ld-arm/eabi-soft-float-r.d: New test. * ld-arm/arm-elf.xp: Use the new tests. binutils: PR binutils/14779 * configure.in: Add checks for wchar.h and mbstate_t. * config.in: Regenerate. * configure: Regenerate. * readelf.c: Conditionally include wchar.h. (print_symbol): Conditionally use mbstate_t. --- binutils/readelf.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 47 insertions(+), 4 deletions(-) (limited to 'binutils/readelf.c') diff --git a/binutils/readelf.c b/binutils/readelf.c index b4f9f4e598..399402dd4a 100644 --- a/binutils/readelf.c +++ b/binutils/readelf.c @@ -48,7 +48,9 @@ #ifdef HAVE_ZLIB_H #include #endif +#ifdef HAVE_WCHAR_H #include +#endif #if __GNUC__ >= 2 /* Define BFD64 here, even if our default architecture is 32 bit ELF @@ -386,7 +388,7 @@ print_vma (bfd_vma vma, print_mode mode) } /* Display a symbol on stdout. Handles the display of control characters and - multibye characters. + multibye characters (assuming the host environment supports them). Display at most abs(WIDTH) characters, truncating as necessary, unless do_wide is true. @@ -400,7 +402,9 @@ print_symbol (int width, const char *symbol) { bfd_boolean extra_padding = FALSE; int num_printed = 0; +#ifdef HAVE_MBSTATE_T mbstate_t state; +#endif int width_remaining; if (width < 0) @@ -417,13 +421,14 @@ print_symbol (int width, const char *symbol) else width_remaining = width; +#ifdef HAVE_MBSTATE_T /* Initialise the multibyte conversion state. */ memset (& state, 0, sizeof (state)); +#endif while (width_remaining) { size_t n; - wchar_t w; const char c = *symbol++; if (c == 0) @@ -449,15 +454,22 @@ print_symbol (int width, const char *symbol) } else { +#ifdef HAVE_MBSTATE_T + wchar_t w; +#endif /* Let printf do the hard work of displaying multibyte characters. */ printf ("%.1s", symbol - 1); width_remaining --; num_printed ++; +#ifdef HAVE_MBSTATE_T /* Try to find out how many bytes made up the character that was just printed. Advance the symbol pointer past the bytes that were displayed. */ n = mbrtowc (& w, symbol - 1, MB_CUR_MAX, & state); +#else + n = 1; +#endif if (n != (size_t) -1 && n != (size_t) -2 && n > 0) symbol += (n - 1); } @@ -2122,11 +2134,34 @@ decode_ARM_machine_flags (unsigned e_flags, char buf[]) case EF_ARM_EABI_VER4: strcat (buf, ", Version4 EABI"); - goto eabi; + while (e_flags) + { + unsigned flag; + + /* Process flags one bit at a time. */ + flag = e_flags & - e_flags; + e_flags &= ~ flag; + + switch (flag) + { + case EF_ARM_BE8: + strcat (buf, ", BE8"); + break; + + case EF_ARM_LE8: + strcat (buf, ", LE8"); + break; + + default: + unknown = 1; + break; + } + break; + } + break; case EF_ARM_EABI_VER5: strcat (buf, ", Version5 EABI"); - eabi: while (e_flags) { unsigned flag; @@ -2145,6 +2180,14 @@ decode_ARM_machine_flags (unsigned e_flags, char buf[]) strcat (buf, ", LE8"); break; + case EF_ARM_ABI_FLOAT_SOFT: /* Conflicts with EF_ARM_SOFT_FLOAT. */ + strcat (buf, ", soft-float ABI"); + break; + + case EF_ARM_ABI_FLOAT_HARD: /* Conflicts with EF_ARM_VFP_FLOAT. */ + strcat (buf, ", hard-float ABI"); + break; + default: unknown = 1; break; -- cgit v1.2.1