[PATCH v2 05/18] RISC-V: Add path of library directories for the 32-bit
Maciej W. Rozycki
macro@wdc.com
Wed Jul 8 18:42:16 GMT 2020
On Wed, 3 Jun 2020, Alistair Francis via Libc-alpha wrote:
> From: Zong Li <zongbox@gmail.com>
>
> For the recommand of 64 bit version, we add the libraries path of 32 bit
> in this patch.
I have troubles comprehending this sentence; also it's repeated literally
below. Please rewrite an remove the duplication.
> The status of RV32 binaries under RV64 kernels is that the ISA
> optionally supports having different XLEN for user and supervisor modes,
> but AFAIK there's no silicon that implements this feature, and the Linux
> kernel doesn't support it yet.
I'm not sure if this note is relevant here.
> For the recommand of 64 bit version, we add the libraries path of 32 bit
> in this patch. This includes a fix to avoid an out of bound array check
> when building with GCC 8.2.
Where exactly is that fix? Shouldn't it be applied as a separate
preparatory change?
> diff --git a/sysdeps/unix/sysv/linux/riscv/dl-cache.h b/sysdeps/unix/sysv/linux/riscv/dl-cache.h
> index c297dfe84f..60fc172edb 100644
> --- a/sysdeps/unix/sysv/linux/riscv/dl-cache.h
> +++ b/sysdeps/unix/sysv/linux/riscv/dl-cache.h
[...]
> @@ -49,9 +51,16 @@
> do \
> { \
> size_t len = strlen (dir); \
> - char path[len + 9]; \
> + char path[len + 10]; \
> memcpy (path, dir, len + 1); \
> - if (len >= 12 && ! memcmp(path + len - 12, "/lib64/lp64d", 12)) \
> + if (len >= 13 && ! memcmp(path + len - 13, "/lib32/ilp32d", 13)) \
> + { \
> + len -= 9; \
> + path[len] = '\0'; \
> + } \
> + if (len >= 12 \
> + && (! memcmp(path + len - 12, "/lib32/ilp32", 12) \
> + || ! memcmp(path + len - 12, "/lib64/lp64d", 12))) \
Please correct indentation above and use tabs throughout.
I think this code should use `else' clauses. While the truncation of the
string will cause subsequent `memcmp' calls to fail, they'll still be
executed, `len' permitting, making this ugly.
Though frankly with the growing number of entries I would rewrite this
sequence of conditionals entirely, as a loop over a (static) array of the
strings processed, cutting the insane number of error-prone hardcoded
string lengths while at it too. It is only ever used in `ldconfig', and
then invoked there at most twice, so it is not that it is critical enough
for performance to justify illegibility, and making additional `strlen'
calls shouldn't be a big deal.
> @@ -64,6 +73,10 @@
> add_dir (path); \
> if (len >= 4 && ! memcmp(path + len - 4, "/lib", 4)) \
> { \
> + memcpy (path + len, "32/ilp32d", 10); \
> + add_dir (path); \
> + memcpy (path + len, "32/ilp32", 9); \
> + add_dir (path); \
Then the same array of strings could be used here (skipping over the
"/lib" prefix throughout).
Maciej
More information about the Libc-alpha
mailing list