diff options
author | CoprDistGit <infra@openeuler.org> | 2024-08-03 06:28:41 +0000 |
---|---|---|
committer | CoprDistGit <infra@openeuler.org> | 2024-08-03 06:28:41 +0000 |
commit | d20db0561a6a36f914fde030512503b114ef9a0c (patch) | |
tree | d4e5e3494d95c269a1cee6195f11bf3201bcadbf /backport-elf-Remove-allocate-use-on-_dl_debug_printf.patch | |
parent | 016343d99b1b269d7246ef1e143d4b54914433d4 (diff) |
automatic import of glibcopeneuler22.03_LTS_SP4openeuler22.03_LTS_SP3openeuler20.03
Diffstat (limited to 'backport-elf-Remove-allocate-use-on-_dl_debug_printf.patch')
-rw-r--r-- | backport-elf-Remove-allocate-use-on-_dl_debug_printf.patch | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/backport-elf-Remove-allocate-use-on-_dl_debug_printf.patch b/backport-elf-Remove-allocate-use-on-_dl_debug_printf.patch new file mode 100644 index 0000000..28d68a6 --- /dev/null +++ b/backport-elf-Remove-allocate-use-on-_dl_debug_printf.patch @@ -0,0 +1,90 @@ +From 40c112ed0d7d0577d2f84851c1f7b8157b3bd2f5 Mon Sep 17 00:00:00 2001 +From: Adhemerval Zanella <adhemerval.zanella@linaro.org> +Date: Mon, 31 Oct 2022 15:46:38 -0300 +Subject: [PATCH] elf: Remove allocate use on _dl_debug_printf + +The maximum number of directives is already limited by the maximum +value of iovec, and current padding usage on _dl_map_object_from_fd +specifies a value of 16 (2 times sizeof (void *)) in hexa, which is +less than the INT_STRLEN_BOUND(void *) (20 for LP64). + +This works if pointers are larger than 8 bytes, for instance 16. +In this case the maximum padding would be 32 and the IFMTSIZE would +be 40. + +The resulting code does use a slightly larger static stack, the +output of -fstack-usage (for x86_64): + + * master: + dl-printf.c:35:1:_dl_debug_vdprintf 1344 dynamic + + * patch: + dl-printf.c:36:1:_dl_debug_vdprintf 2416 static + +However, there is an improvement in code generation: + + * master + text data bss dec hex filename + 330900 3309 ced elf/dl-printf.os + + * patch +text data bss dec hex filename +315100 3151 c4f elf/dl-printf.os + +Checked on x86_64-linux-gnu. + +Reviewed-by: Szabolcs Nagy <szabolcs.nagy@arm.com> +--- + elf/dl-misc.c | 15 +++++++-------- + 1 file changed, 7 insertions(+), 8 deletions(-) + +diff --git a/elf/dl-misc.c b/elf/dl-misc.c +index a11d11d5..4a33737c 100644 +--- a/elf/dl-misc.c ++++ b/elf/dl-misc.c +@@ -34,6 +34,7 @@ + #include <_itoa.h> + #include <dl-writev.h> + #include <not-cancel.h> ++#include <intprops.h> + + /* Read the whole contents of FILE into new mmap'd space with given + protections. *SIZEP gets the size of the file. On error MAP_FAILED +@@ -79,6 +80,9 @@ _dl_debug_vdprintf (int fd, int tag_p, const char *fmt, va_list arg) + { + # define NIOVMAX 64 + struct iovec iov[NIOVMAX]; ++ /* Maximum size for 'd', 'u', and 'x' including padding. */ ++ enum { IFMTSIZE = INT_STRLEN_BOUND(void *) }; ++ char ifmtbuf[NIOVMAX][IFMTSIZE]; + int niov = 0; + pid_t pid = 0; + char pidbuf[12]; +@@ -143,6 +147,8 @@ _dl_debug_vdprintf (int fd, int tag_p, const char *fmt, va_list arg) + if (*fmt == '*') + { + width = va_arg (arg, int); ++ /* The maximum padding accepted is up to pointer size. */ ++ assert (width < IFMTSIZE); + ++fmt; + } + +@@ -203,14 +209,7 @@ _dl_debug_vdprintf (int fd, int tag_p, const char *fmt, va_list arg) + #endif + } + +- /* We use alloca() to allocate the buffer with the most +- pessimistic guess for the size. Using alloca() allows +- having more than one integer formatting in a call. */ +- int size = 1 + 3 * sizeof (unsigned long int); +- if (width + 1 > size) +- size = width + 1; +- char *buf = (char *) alloca (size); +- char *endp = &buf[size]; ++ char *endp = &ifmtbuf[niov][IFMTSIZE]; + char *cp = _itoa (num, endp, *fmt == 'x' ? 16 : 10, 0); + + /* Pad to the width the user specified. */ +-- +2.33.0 + |