From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-oo1-xc2e.google.com (mail-oo1-xc2e.google.com [IPv6:2607:f8b0:4864:20::c2e]) by sourceware.org (Postfix) with ESMTPS id 3037E3858D1E for ; Mon, 13 Mar 2023 16:56:15 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 3037E3858D1E Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=linaro.org Received: by mail-oo1-xc2e.google.com with SMTP id bd3-20020a4aee03000000b00517affa07c0so1921360oob.7 for ; Mon, 13 Mar 2023 09:56:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1678726574; h=content-transfer-encoding:in-reply-to:organization:from:references :cc:to:content-language:subject:user-agent:mime-version:date :message-id:from:to:cc:subject:date:message-id:reply-to; bh=gmacguUsPbpvQvjsFOSDakww1uz/ma9BoXlWt131gf4=; b=jQR8EItKpXJhhUcVyrTreZLi4XzRrnbD7faafmBDrxBkKOE/w9Mq7RQqOFlXmEvE13 Y2n0QULb+nSIWBkQRYSBwQZWQvqSU/l0caM9doDxdCs0MP5t0wfvMyBD4qAly41SZwpp /oxEc32jFIPdAJYx/boamkqtgeEM1s33qFkCRpnznJPNtCSyHHaKBbnwo/KwjXtghbMS tDu/1c1B1a9zaqtBUb43gwQQcsZzXD9rj4InyhChnItI6LUnDCfkPE5m9iL5+KUhcdw+ 4AMPh/q8b187eVNW/YoAZcQKXPh6lEQeOJ0d6jJo9wdd8Rfn+3r/mG/PaCqDgBko04xj OSSA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1678726574; h=content-transfer-encoding:in-reply-to:organization:from:references :cc:to:content-language:subject:user-agent:mime-version:date :message-id:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=gmacguUsPbpvQvjsFOSDakww1uz/ma9BoXlWt131gf4=; b=DpFGIVE8FJS6NESzG+7EWBjhErOrWSDYo/67vNVKL8hz3XvRCrQE0FTZl/wKx/RR5V Xw/TOv/BvTEsS4RbJCSOGelZZeuvb6SzzeOCh9dALAA4yaL54qguv9O1UrZTzigmvj00 UDsX1KLwjKd2y5neMyGFr9UKBerAufL9DiB46TJgxPar9NONfW6eJaIjOAVbWpwhRAKx hhVS6V+qjYGfbJUOH8qnhzvA9eWASQMWx/UA6JEgfkhYvdJZB9JGHRWEm9EdvE6EzH4Z RqoLi36dWa/Kld/YOoWXALa4tU9K8Jq7dwMecFoh/NWm23hFz0GXmHubRia7pxfPaTRU Y9Kg== X-Gm-Message-State: AO0yUKXezeUz/FDKa+rQPTgZ12dxzx3YY3I9wzdx8tD3NY5M1cbKcjHD yg/TnzU4w1LS485FhaxCTid4gHYUwmeVQeeJth91Rw== X-Google-Smtp-Source: AK7set/+URVDmy4L37fKXRAe+2hT/LczeeNrrPGlKqib7/9YjQonIvJJha2+ka6r/iN7KX31mwe1Rg== X-Received: by 2002:a4a:1586:0:b0:517:a7d1:9762 with SMTP id 128-20020a4a1586000000b00517a7d19762mr9099478oon.7.1678726574288; Mon, 13 Mar 2023 09:56:14 -0700 (PDT) Received: from ?IPV6:2804:1b3:a7c0:544b:c5ae:2fda:455d:6e31? ([2804:1b3:a7c0:544b:c5ae:2fda:455d:6e31]) by smtp.gmail.com with ESMTPSA id u7-20020a4a5707000000b00524f47b4682sm108481ooa.10.2023.03.13.09.56.12 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Mon, 13 Mar 2023 09:56:13 -0700 (PDT) Message-ID: Date: Mon, 13 Mar 2023 13:56:10 -0300 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:102.0) Gecko/20100101 Thunderbird/102.8.0 Subject: Re: [PATCH] LoongArch: Add support for ldconfig. Content-Language: en-US To: caiyinyu , libc-alpha@sourceware.org Cc: xry111@xry111.site References: <20230308014344.3194588-1-caiyinyu@loongson.cn> From: Adhemerval Zanella Netto Organization: Linaro In-Reply-To: <20230308014344.3194588-1-caiyinyu@loongson.cn> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Spam-Status: No, score=-12.1 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,KAM_SHORT,NICE_REPLY_A,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS,TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: LGTM, some minor remarks below. On 07/03/23 22:43, caiyinyu wrote: > --- > elf/cache.c | 6 ++ > sysdeps/generic/ldconfig.h | 2 + > sysdeps/unix/sysv/linux/loongarch/dl-cache.h | 82 +++++++++++++++++++ > .../unix/sysv/linux/loongarch/readelflib.c | 70 ++++++++++++++++ > 4 files changed, 160 insertions(+) > create mode 100644 sysdeps/unix/sysv/linux/loongarch/dl-cache.h > create mode 100644 sysdeps/unix/sysv/linux/loongarch/readelflib.c > > diff --git a/elf/cache.c b/elf/cache.c > index c4c3139264..1a96e770aa 100644 > --- a/elf/cache.c > +++ b/elf/cache.c > @@ -225,6 +225,12 @@ print_entry (const char *lib, int flag, uint64_t hwcap, > case FLAG_RISCV_FLOAT_ABI_DOUBLE: > fputs (",double-float", stdout); > break; > + case FLAG_LARCH_FLOAT_ABI_SOFT: > + fputs (",soft-float", stdout); > + break; > + case FLAG_LARCH_FLOAT_ABI_DOUBLE: > + fputs (",double-float", stdout); > + break; > case 0: > break; > default: > diff --git a/sysdeps/generic/ldconfig.h b/sysdeps/generic/ldconfig.h > index e9e9e19d0f..864d223745 100644 > --- a/sysdeps/generic/ldconfig.h > +++ b/sysdeps/generic/ldconfig.h > @@ -45,6 +45,8 @@ > #define FLAG_MIPS64_LIBN64_NAN2008 0x0e00 > #define FLAG_RISCV_FLOAT_ABI_SOFT 0x0f00 > #define FLAG_RISCV_FLOAT_ABI_DOUBLE 0x1000 > +#define FLAG_LARCH_FLOAT_ABI_SOFT 0x1100 > +#define FLAG_LARCH_FLOAT_ABI_DOUBLE 0x1200 > > /* Name of auxiliary cache. */ > #define _PATH_LDCONFIG_AUX_CACHE "/var/cache/ldconfig/aux-cache" > diff --git a/sysdeps/unix/sysv/linux/loongarch/dl-cache.h b/sysdeps/unix/sysv/linux/loongarch/dl-cache.h > new file mode 100644 > index 0000000000..cb06feaa83 > --- /dev/null > +++ b/sysdeps/unix/sysv/linux/loongarch/dl-cache.h > @@ -0,0 +1,82 @@ > +/* Support for reading /etc/ld.so.cache files written by Linux ldconfig. > + Copyright (C) 2003-2023 Free Software Foundation, Inc. s/2003/2023 since it is a new file. Same for the other new file. > + This file is part of the GNU C Library. > + > + 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 > + . */ > + > +#include > +#include > + > +#if defined __loongarch_double_float > +# define _DL_CACHE_DEFAULT_ID (FLAG_LARCH_FLOAT_ABI_DOUBLE | FLAG_ELF_LIBC6) > +#else > +# define _DL_CACHE_DEFAULT_ID (FLAG_LARCH_FLOAT_ABI_SOFT | FLAG_ELF_LIBC6) > +#endif > + > +#define _dl_cache_check_flags(flags) \ > + ((flags) == _DL_CACHE_DEFAULT_ID) > + > +/* If given a path to one of our library directories, adds every library > + directory via add_dir (), otherwise just adds the giver directory. On > + LoongArch, libraries can be found in paths ending in: > + - /lib64 > + - /lib64/sf > + so this will add all of those paths. */ > + > +#define add_system_dir(dir) \ > + do \ > + { \ > + static const char* lib_dirs[] = { \ > + "/lib64", \ > + "/lib64/sf", \ > + NULL, \ > + }; \ > + const size_t lib_len = sizeof ("/lib") - 1; \ > + size_t len = strlen (dir); \ > + char path[len + 6]; \ > + const char **ptr; \ > + \ > + memcpy (path, dir, len + 1); \ > + \ > + for (ptr = lib_dirs; *ptr != NULL; ptr++) \ I think you can use array_length here and avoid the need to add the final NULL entry. > + { \ > + const char *lib_dir = *ptr; \ > + size_t dir_len = strlen (lib_dir); \ > + \ > + if (len >= dir_len \ > + && !memcmp (path + len - dir_len, lib_dir, dir_len)) \ memcmp (...) == 0 > + { \ > + len -= dir_len - lib_len; \ > + path[len] = '\0'; \ > + break; \ > + } \ > + } \ > + add_dir (path); \ > + if (len >= lib_len \ > + && !memcmp (path + len - lib_len, "/lib", lib_len)) \ memcmp (...) == 0 > + for (ptr = lib_dirs; *ptr != NULL; ptr++) \ > + { \ > + const char *lib_dir = *ptr; \ > + size_t dir_len = strlen (lib_dir); \ > + \ > + assert (dir_len >= lib_len); \ > + memcpy (path + len, lib_dir + lib_len, \ > + dir_len - lib_len + 1); \ > + add_dir (path); \ > + } \ > + } while (0) > + > + > +#include_next > diff --git a/sysdeps/unix/sysv/linux/loongarch/readelflib.c b/sysdeps/unix/sysv/linux/loongarch/readelflib.c > new file mode 100644 > index 0000000000..87dd4cfce2 > --- /dev/null > +++ b/sysdeps/unix/sysv/linux/loongarch/readelflib.c > @@ -0,0 +1,70 @@ > +/* Support for reading ELF files. > + Copyright (C) 1999-2023 Free Software Foundation, Inc. > + This file is part of the GNU C Library. > + > + 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_elf64_file (const char *file_name, const char *lib, > + int *flag, unsigned int *isa_level, char **soname, > + void *file_contents, size_t file_length); > + > +#define SUPPORTED_ELF_FLAGS \ > + (EF_LARCH_ABI_DOUBLE_FLOAT | EF_LARCH_ABI_SOFT_FLOAT) > + > +/* 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 *isa_level, char **soname, void *file_contents, > + size_t file_length) > +{ > + ElfW(Ehdr) *elf_header = (ElfW(Ehdr) *) file_contents; > + Elf64_Ehdr *elf64_header = (Elf64_Ehdr *) elf_header; > + int ret; > + long flags; > + > + /* LoongArch libraries are always libc.so.6+. */ > + *flag = FLAG_ELF_LIBC6; > + > + ret = process_elf64_file (file_name, lib, flag, isa_level, soname, > + file_contents, file_length); > + flags = elf64_header->e_flags; > + > + /* LoongArch linkers encode the floating point ABI as part of the ELF headers. */ > + switch (flags & SUPPORTED_ELF_FLAGS) > + { > + case EF_LARCH_ABI_SOFT_FLOAT: > + *flag |= FLAG_LARCH_FLOAT_ABI_SOFT; > + break; > + case EF_LARCH_ABI_DOUBLE_FLOAT: > + *flag |= FLAG_LARCH_FLOAT_ABI_DOUBLE; > + break; > + default: > + return 1; > + } > + > + /* If there are any other ELF flags set then glibc doesn't support this > + library. */ > + if (flags & ~SUPPORTED_ELF_FLAGS) > + return 1; > + > + return ret; > +} > + > +#undef __ELF_NATIVE_CLASS > +#undef process_elf_file > +#define process_elf_file process_elf64_file > +#define __ELF_NATIVE_CLASS 64 > +#include "elf/readelflib.c"