From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 25140 invoked by alias); 26 Nov 2012 15:10:21 -0000 Received: (qmail 25120 invoked by uid 22791); 26 Nov 2012 15:10:17 -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, 26 Nov 2012 15:10:07 +0000 Received: from bsmtp by cheddar.halon.org.uk with local-bsmtp (Exim 4.72) (envelope-from ) id 1Td0Jy-0007GF-I0 for libc-ports@sourceware.org; Mon, 26 Nov 2012 15:10:06 +0000 Received: from steve by tack.local with local (Exim 4.80) (envelope-from ) id 1Td0JZ-000063-2M for libc-ports@sourceware.org; Mon, 26 Nov 2012 15:09:41 +0000 Date: Mon, 26 Nov 2012 15:10:00 -0000 From: Steve McIntyre To: libc-ports@sourceware.org Subject: [PATCH 3/4] Tag ARM and AArch64 binaries in the ldconfig cache Message-ID: <20121126150940.GC28791@einval.com> References: <20121126150131.GA28791@einval.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20121126150131.GA28791@einval.com> 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-11/txt/msg00111.txt.bz2 Again, similarly to other architectures - detect AArch64 and ARM (soft-float and hard-float) binaries in ldconfig and tag them appropriately. On ARM, use the new ELF flags from binutils to classify binaries if those flags are set. ======================================================== Tag ARM and AArch64 binaries in the ldconfig cache * sysdeps/unix/sysv/linux/arm/readelflib.c: New file. * sysdeps/unix/sysv/linux/aarch64/readelflib.c: Ditto. Signed-off-by: Steve McIntyre --- ports/sysdeps/unix/sysv/linux/aarch64/readelflib.c | 1 + ports/sysdeps/unix/sysv/linux/arm/readelflib.c | 73 ++++++++++++++++++++ 2 files changed, 74 insertions(+) create mode 100644 ports/sysdeps/unix/sysv/linux/aarch64/readelflib.c create mode 100644 ports/sysdeps/unix/sysv/linux/arm/readelflib.c diff --git a/ports/sysdeps/unix/sysv/linux/aarch64/readelflib.c b/ports/sysdeps/unix/sysv/linux/aarch64/readelflib.c new file mode 100644 index 0000000..df1a822 --- /dev/null +++ b/ports/sysdeps/unix/sysv/linux/aarch64/readelflib.c @@ -0,0 +1 @@ +#include "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