summaryrefslogtreecommitdiffstats
path: root/meta/recipes-devtools/binutils
diff options
context:
space:
mode:
authorJiaying Song <jiaying.song.cn@windriver.com>2025-02-05 16:06:35 +0800
committerSteve Sakoman <steve@sakoman.com>2025-02-12 06:25:37 -0800
commit6d1fef08e1410eaad6ed57e480647550dbda1e3f (patch)
treec0f5736f56a2e347713dd050c1af0424f112e042 /meta/recipes-devtools/binutils
parente723021fbcb710945931ed537e5d3a8bfecb2f5a (diff)
downloadpoky-6d1fef08e1410eaad6ed57e480647550dbda1e3f.tar.gz
binutils: File name too long causing failure to open temporary head file in dlltool
During the execution of the command: i686-w64-mingw32-dlltool --input-def $def_filepath --output-delaylib $filepath --dllname qemu.exe An error occurred: i686-w64-mingw32-dlltool: failed to open temporary head file: ..._w64_mingw32_nativesdk_qemu_8_2_2_build_plugins_libqemu_plugin_api_a_h.s Due to the path length exceeding the Linux system's file name length limit (NAME_MAX=255), the temporary file name generated by the i686-w64-mingw32-dlltool command becomes too long to open. To address this, a new temporary file name prefix is generated using tmp_prefix = prefix_encode ("d", getpid()), ensuring that the file name does not exceed the system's length limit. Allow for "snnnnn.o" suffix when testing against NAME_MAX, and tidy TMP_STUB handling by overwriting a prior nnnnn.o string rather than copying the entire name. (From OE-Core rev: 617df4ee1d6523ded43f156af8206dfca2c0c8ee) Signed-off-by: Jiaying Song <jiaying.song.cn@windriver.com> Signed-off-by: Steve Sakoman <steve@sakoman.com>
Diffstat (limited to 'meta/recipes-devtools/binutils')
-rw-r--r--meta/recipes-devtools/binutils/binutils-2.42.inc1
-rw-r--r--meta/recipes-devtools/binutils/binutils/0017-dlltool-file-name-too-long.patch208
2 files changed, 209 insertions, 0 deletions
diff --git a/meta/recipes-devtools/binutils/binutils-2.42.inc b/meta/recipes-devtools/binutils/binutils-2.42.inc
index 3784d26f48..8bccf8c56a 100644
--- a/meta/recipes-devtools/binutils/binutils-2.42.inc
+++ b/meta/recipes-devtools/binutils/binutils-2.42.inc
@@ -37,5 +37,6 @@ SRC_URI = "\
37 file://0014-Remove-duplicate-pe-dll.o-entry-deom-targ_extra_ofil.patch \ 37 file://0014-Remove-duplicate-pe-dll.o-entry-deom-targ_extra_ofil.patch \
38 file://0015-gprofng-change-use-of-bignum-to-bigint.patch \ 38 file://0015-gprofng-change-use-of-bignum-to-bigint.patch \
39 file://0016-CVE-2024-53589.patch \ 39 file://0016-CVE-2024-53589.patch \
40 file://0017-dlltool-file-name-too-long.patch \
40" 41"
41S = "${WORKDIR}/git" 42S = "${WORKDIR}/git"
diff --git a/meta/recipes-devtools/binutils/binutils/0017-dlltool-file-name-too-long.patch b/meta/recipes-devtools/binutils/binutils/0017-dlltool-file-name-too-long.patch
new file mode 100644
index 0000000000..2b759c1ee8
--- /dev/null
+++ b/meta/recipes-devtools/binutils/binutils/0017-dlltool-file-name-too-long.patch
@@ -0,0 +1,208 @@
1From d95d8395b3a533461f46e8b7e55fef540fc2621b Mon Sep 17 00:00:00 2001
2From: Jiaying Song <jiaying.song.cn@windriver.com>
3Date: Tue, 13 Aug 2024 10:31:21 +0800
4Subject: [PATCH] dlltool: file name too long
5
6During the execution of the command: i686-w64-mingw32-dlltool
7--input-def $def_filepath --output-delaylib $filepath --dllname qemu.exe
8An error occurred:
9i686-w64-mingw32-dlltool: failed to open temporary head file: ..._w64_mingw32_nativesdk_qemu_8_2_2_build_plugins_libqemu_plugin_api_a_h.s
10
11Due to the path length exceeding the Linux system's file name length
12limit (NAME_MAX=255), the temporary file name generated by the
13i686-w64-mingw32-dlltool command becomes too long to open. To address
14this, a new temporary file name prefix is generated using tmp_prefix =
15prefix_encode ("d", getpid()), ensuring that the file name does not
16exceed the system's length limit.
17
18Upstream-Status: Backport
19[https://github.com/bminor/binutils-gdb/commit/a253bea8995323201b016fe477280c1782688ab4]
20
21Signed-off-by: Jiaying Song <jiaying.song.cn@windriver.com>
22Reviewed-by: Alan Modra <amodra@gmail.com>
23
24Allow for "snnnnn.o" suffix when testing against NAME_MAX, and tidy
25TMP_STUB handling by overwriting a prior nnnnn.o string rather than
26copying the entire name.
27
28* dlltool.c (TMP_STUB): Add "nnnnn.o" to format.
29(make_one_lib_file): Localise variables. Don't copy TMP_STUB,
30overwrite suffix instead.
31(gen_lib_file): Similarly.
32(main): Allow for max suffix when testing against NAME_MAX.
33
34Upstream-Status: Backport
35[https://github.com/bminor/binutils-gdb/commit/d0285cdf58adf04e861cd1687f7ecec65937c99d]
36
37Signed-off-by: Jiaying Song <jiaying.song.cn@windriver.com>
38---
39 binutils/dlltool.c | 64 +++++++++++++++++-----------------------------
40 1 file changed, 24 insertions(+), 40 deletions(-)
41
42diff --git a/binutils/dlltool.c b/binutils/dlltool.c
43index 066c99a4..94f6c34b 100644
44--- a/binutils/dlltool.c
45+++ b/binutils/dlltool.c
46@@ -498,7 +498,7 @@ char *tmp_stub_buf;
47 #define TMP_HEAD_O dlltmp (&tmp_head_o_buf, "%sh.o")
48 #define TMP_TAIL_S dlltmp (&tmp_tail_s_buf, "%st.s")
49 #define TMP_TAIL_O dlltmp (&tmp_tail_o_buf, "%st.o")
50-#define TMP_STUB dlltmp (&tmp_stub_buf, "%ss")
51+#define TMP_STUB dlltmp (&tmp_stub_buf, "%ssnnnnn.o")
52
53 /* This bit of assembly does jmp * .... */
54 static const unsigned char i386_jtab[] =
55@@ -2401,26 +2401,11 @@ make_imp_label (const char *prefix, const char *name)
56 static bfd *
57 make_one_lib_file (export_type *exp, int i, int delay)
58 {
59- bfd * abfd;
60- asymbol * exp_label;
61- asymbol * iname = 0;
62- asymbol * iname2;
63- asymbol * iname_lab;
64- asymbol ** iname_lab_pp;
65- asymbol ** iname_pp;
66-#ifndef EXTRA
67-#define EXTRA 0
68-#endif
69- asymbol * ptrs[NSECS + 4 + EXTRA + 1];
70- flagword applicable;
71- char * outname = xmalloc (strlen (TMP_STUB) + 10);
72- int oidx = 0;
73-
74-
75- sprintf (outname, "%s%05d.o", TMP_STUB, i);
76-
77- abfd = bfd_openw (outname, HOW_BFD_WRITE_TARGET);
78+ char *outname = TMP_STUB;
79+ size_t name_len = strlen (outname);
80+ sprintf (outname + name_len - 7, "%05d.o", i);
81
82+ bfd *abfd = bfd_openw (outname, HOW_BFD_WRITE_TARGET);
83 if (!abfd)
84 /* xgettext:c-format */
85 fatal (_("bfd_open failed open stub file: %s: %s"),
86@@ -2437,9 +2422,13 @@ make_one_lib_file (export_type *exp, int i, int delay)
87 bfd_set_private_flags (abfd, F_INTERWORK);
88 #endif
89
90- applicable = bfd_applicable_section_flags (abfd);
91-
92 /* First make symbols for the sections. */
93+ flagword applicable = bfd_applicable_section_flags (abfd);
94+#ifndef EXTRA
95+#define EXTRA 0
96+#endif
97+ asymbol *ptrs[NSECS + 4 + EXTRA + 1];
98+ int oidx = 0;
99 for (i = 0; i < NSECS; i++)
100 {
101 sinfo *si = secdata + i;
102@@ -2466,7 +2455,7 @@ make_one_lib_file (export_type *exp, int i, int delay)
103
104 if (! exp->data)
105 {
106- exp_label = bfd_make_empty_symbol (abfd);
107+ asymbol *exp_label = bfd_make_empty_symbol (abfd);
108 exp_label->name = make_imp_label ("", exp->name);
109 exp_label->section = secdata[TEXT].sec;
110 exp_label->flags = BSF_GLOBAL;
111@@ -2482,6 +2471,7 @@ make_one_lib_file (export_type *exp, int i, int delay)
112 /* Generate imp symbols with one underscore for Microsoft
113 compatibility, and with two underscores for backward
114 compatibility with old versions of cygwin. */
115+ asymbol *iname = NULL;
116 if (create_compat_implib)
117 {
118 iname = bfd_make_empty_symbol (abfd);
119@@ -2491,25 +2481,24 @@ make_one_lib_file (export_type *exp, int i, int delay)
120 iname->value = 0;
121 }
122
123- iname2 = bfd_make_empty_symbol (abfd);
124+ asymbol *iname2 = bfd_make_empty_symbol (abfd);
125 iname2->name = make_imp_label ("__imp_", exp->name);
126 iname2->section = secdata[IDATA5].sec;
127 iname2->flags = BSF_GLOBAL;
128 iname2->value = 0;
129
130- iname_lab = bfd_make_empty_symbol (abfd);
131-
132+ asymbol *iname_lab = bfd_make_empty_symbol (abfd);
133 iname_lab->name = head_label;
134 iname_lab->section = bfd_und_section_ptr;
135 iname_lab->flags = 0;
136 iname_lab->value = 0;
137
138- iname_pp = ptrs + oidx;
139+ asymbol **iname_pp = ptrs + oidx;
140 if (create_compat_implib)
141 ptrs[oidx++] = iname;
142 ptrs[oidx++] = iname2;
143
144- iname_lab_pp = ptrs + oidx;
145+ asymbol **iname_lab_pp = ptrs + oidx;
146 ptrs[oidx++] = iname_lab;
147
148 ptrs[oidx] = 0;
149@@ -3089,29 +3078,26 @@ gen_lib_file (int delay)
150
151 if (dontdeltemps < 2)
152 {
153- char *name;
154- size_t stub_len = strlen (TMP_STUB);
155+ char *name = TMP_STUB;
156+ size_t name_len = strlen (name);
157
158- name = xmalloc (stub_len + 10);
159- memcpy (name, TMP_STUB, stub_len);
160 for (i = 0; (exp = d_exports_lexically[i]); i++)
161 {
162 /* Don't delete non-existent stubs for PRIVATE entries. */
163 if (exp->private)
164 continue;
165- sprintf (name + stub_len, "%05d.o", i);
166+ sprintf (name + name_len - 7, "%05d.o", i);
167 if (unlink (name) < 0)
168 /* xgettext:c-format */
169 non_fatal (_("cannot delete %s: %s"), name, strerror (errno));
170 if (ext_prefix_alias)
171 {
172- sprintf (name + stub_len, "%05d.o", i + PREFIX_ALIAS_BASE);
173+ sprintf (name + name_len - 7, "%05d.o", i + PREFIX_ALIAS_BASE);
174 if (unlink (name) < 0)
175 /* xgettext:c-format */
176 non_fatal (_("cannot delete %s: %s"), name, strerror (errno));
177 }
178 }
179- free (name);
180 }
181
182 inform (_("Created lib file"));
183@@ -4096,9 +4082,9 @@ main (int ac, char **av)
184 if (tmp_prefix == NULL)
185 {
186 /* If possible use a deterministic prefix. */
187- if (imp_name || delayimp_name)
188+ const char *input = imp_name ? imp_name : delayimp_name;
189+ if (input && strlen (input) + sizeof ("_snnnnn.o") - 1 <= NAME_MAX)
190 {
191- const char *input = imp_name ? imp_name : delayimp_name;
192 tmp_prefix = xmalloc (strlen (input) + 2);
193 sprintf (tmp_prefix, "%s_", input);
194 for (i = 0; tmp_prefix[i]; i++)
195@@ -4106,9 +4092,7 @@ main (int ac, char **av)
196 tmp_prefix[i] = '_';
197 }
198 else
199- {
200- tmp_prefix = prefix_encode ("d", getpid ());
201- }
202+ tmp_prefix = prefix_encode ("d", getpid ());
203 }
204
205 mangle_defs ();
206--
2072.34.1
208