From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 451 invoked by alias); 3 Dec 2012 15:35:15 -0000 Received: (qmail 340 invoked by uid 22791); 3 Dec 2012 15:35:15 -0000 X-SWARE-Spam-Status: No, hits=-1.9 required=5.0 tests=AWL,BAYES_00 X-Spam-Check-By: sourceware.org Received: from cheddar.halon.org.uk (HELO cheddar.halon.org.uk) (217.10.144.130) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Mon, 03 Dec 2012 15:35:07 +0000 Received: from bsmtp by cheddar.halon.org.uk with local-bsmtp (Exim 4.72) (envelope-from ) id 1TfY30-0003J7-N3; Mon, 03 Dec 2012 15:35:06 +0000 Received: from steve by tack.local with local (Exim 4.80) (envelope-from ) id 1TfY2g-00073W-R7; Mon, 03 Dec 2012 15:34:46 +0000 Date: Mon, 03 Dec 2012 15:35:00 -0000 From: Steve McIntyre To: libc-ports@sourceware.org Cc: Carlos O'Donell , "Joseph S. Myers" , Marcus Shawcroft Subject: [PATCH] ARM: Tag ARM and AArch64 binaries in the ldconfig cache Message-ID: <20121203153446.GD22509@einval.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline X-attached: none User-Agent: Mutt/1.5.21 (2010-09-15) Mailing-List: contact libc-ports-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Post: List-Help: , Sender: libc-ports-owner@sourceware.org X-SW-Source: 2012-12/txt/msg00003.txt.bz2 Splitting up code as requested. Here's patch #1 for ARM. Identical to the similar code I just posted for AArch64, so I'd suggest using #include in AArch64 to pull in the ARM version if you're happy with that. ============================== Tag ARM and AArch64 binaries in the ldconfig cache * sysdeps/unix/sysv/linux/arm/readelflib.c: New file. Add the correct tags for ARM and AArch64 libraries in the ldconfig cache for ARM. Signed-off-by: Steve McIntyre --- ports/sysdeps/unix/sysv/linux/arm/readelflib.c | 73 ++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 ports/sysdeps/unix/sysv/linux/arm/readelflib.c diff --git a/ports/sysdeps/unix/sysv/linux/arm/readelflib.c b/ports/sysdeps/unix/sysv/linux/arm/readelflib.c new file mode 100644 index 0000000..e4ba2b0 --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/arm/readelflib.c @@ -0,0 +1,73 @@ +/* Copyright (C) 1999-2012 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Andreas Jaeger , 1999 and + Jakub Jelinek , 1999. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + + +int process_elf32_file (const char *file_name, const char *lib, int *flag, + unsigned int *osversion, char **soname, + void *file_contents, size_t file_length); +int process_elf64_file (const char *file_name, const char *lib, int *flag, + unsigned int *osversion, char **soname, + void *file_contents, size_t file_length); + +/* Returns 0 if everything is ok, != 0 in case of error. */ +int +process_elf_file (const char *file_name, const char *lib, int *flag, + unsigned int *osversion, char **soname, void *file_contents, + size_t file_length) +{ + ElfW(Ehdr) *elf_header = (ElfW(Ehdr) *) file_contents; + int ret; + + if (elf_header->e_ident [EI_CLASS] == ELFCLASS32) + { + Elf32_Ehdr *elf32_header = (Elf32_Ehdr *) elf_header; + + ret = process_elf32_file (file_name, lib, flag, osversion, soname, + file_contents, file_length); + + if (!ret && EF_ARM_EABI_VERSION(elf32_header->e_flags) == EF_ARM_EABI_VER5) + { + if (elf32_header->e_flags & EF_ARM_ABI_FLOAT_HARD) + *flag = FLAG_ARM_LIBHF|FLAG_ELF_LIBC6; + else if (elf32_header->e_flags & EF_ARM_ABI_FLOAT_SOFT) + *flag = FLAG_ELF_LIBC6; + } + } + else + { + ret = process_elf64_file (file_name, lib, flag, osversion, soname, + file_contents, file_length); + /* AArch64 libraries are always libc.so.6+. */ + if (!ret) + *flag = FLAG_AARCH64_LIB64|FLAG_ELF_LIBC6; + } + return ret; +} + +#undef __ELF_NATIVE_CLASS +#undef process_elf_file +#define process_elf_file process_elf32_file +#define __ELF_NATIVE_CLASS 32 +#include "elf/readelflib.c" + +#undef __ELF_NATIVE_CLASS +#undef process_elf_file +#define process_elf_file process_elf64_file +#define __ELF_NATIVE_CLASS 64 +#include "elf/readelflib.c" -- 1.7.10.4 Cheers, -- Steve McIntyre steve.mcintyre@linaro.org Linaro.org | Open source software for ARM SoCs