* gnu/packages/patches/binutils-2.37-file-descriptor-leak.patch: New file. * gnu/packages/local.mk (dist_patch_DATA): Add it. * gnu/packages/base.scm (binutils)[source]: Use it.
		
			
				
	
	
		
			231 lines
		
	
	
	
		
			6.2 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			231 lines
		
	
	
	
		
			6.2 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| From 1c611b40e6bfc8029bff7696814330b5bc0ee5c0 Mon Sep 17 00:00:00 2001
 | |
| From: "H.J. Lu" <hjl.tools@gmail.com>
 | |
| Date: Mon, 26 Jul 2021 05:59:55 -0700
 | |
| Subject: [PATCH] bfd: Close the file descriptor if there is no archive fd
 | |
| 
 | |
| Close the file descriptor if there is no archive plugin file descriptor
 | |
| to avoid running out of file descriptors on thin archives with many
 | |
| archive members.
 | |
| 
 | |
| bfd/
 | |
| 
 | |
| 	PR ld/28138
 | |
| 	* plugin.c (bfd_plugin_close_file_descriptor): Close the file
 | |
| 	descriptor there is no archive plugin file descriptor.
 | |
| 
 | |
| ld/
 | |
| 
 | |
| 	PR ld/28138
 | |
| 	* testsuite/ld-plugin/lto.exp: Run tmpdir/pr28138 only for
 | |
| 	native build.
 | |
| 
 | |
| 	PR ld/28138
 | |
| 	* testsuite/ld-plugin/lto.exp: Run ld/28138 tests.
 | |
| 	* testsuite/ld-plugin/pr28138.c: New file.
 | |
| 	* testsuite/ld-plugin/pr28138-1.c: Likewise.
 | |
| 	* testsuite/ld-plugin/pr28138-2.c: Likewise.
 | |
| 	* testsuite/ld-plugin/pr28138-3.c: Likewise.
 | |
| 	* testsuite/ld-plugin/pr28138-4.c: Likewise.
 | |
| 	* testsuite/ld-plugin/pr28138-5.c: Likewise.
 | |
| 	* testsuite/ld-plugin/pr28138-6.c: Likewise.
 | |
| 	* testsuite/ld-plugin/pr28138-7.c: Likewise.
 | |
| 
 | |
| (cherry picked from commit 5a98fb7513b559e20dfebdbaa2a471afda3b4742)
 | |
| (cherry picked from commit 7dc37e1e1209c80e0bab784df6b6bac335e836f2)
 | |
| ---
 | |
|  bfd/plugin.c                       |  8 +++++++
 | |
|  ld/testsuite/ld-plugin/lto.exp     | 34 ++++++++++++++++++++++++++++++
 | |
|  ld/testsuite/ld-plugin/pr28138-1.c |  6 ++++++
 | |
|  ld/testsuite/ld-plugin/pr28138-2.c |  6 ++++++
 | |
|  ld/testsuite/ld-plugin/pr28138-3.c |  6 ++++++
 | |
|  ld/testsuite/ld-plugin/pr28138-4.c |  6 ++++++
 | |
|  ld/testsuite/ld-plugin/pr28138-5.c |  6 ++++++
 | |
|  ld/testsuite/ld-plugin/pr28138-6.c |  6 ++++++
 | |
|  ld/testsuite/ld-plugin/pr28138-7.c |  6 ++++++
 | |
|  ld/testsuite/ld-plugin/pr28138.c   | 20 ++++++++++++++++++
 | |
|  10 files changed, 104 insertions(+)
 | |
|  create mode 100644 ld/testsuite/ld-plugin/pr28138-1.c
 | |
|  create mode 100644 ld/testsuite/ld-plugin/pr28138-2.c
 | |
|  create mode 100644 ld/testsuite/ld-plugin/pr28138-3.c
 | |
|  create mode 100644 ld/testsuite/ld-plugin/pr28138-4.c
 | |
|  create mode 100644 ld/testsuite/ld-plugin/pr28138-5.c
 | |
|  create mode 100644 ld/testsuite/ld-plugin/pr28138-6.c
 | |
|  create mode 100644 ld/testsuite/ld-plugin/pr28138-7.c
 | |
|  create mode 100644 ld/testsuite/ld-plugin/pr28138.c
 | |
| 
 | |
| diff --git a/bfd/plugin.c b/bfd/plugin.c
 | |
| index 6cfa2b66470..3bab8febe88 100644
 | |
| --- a/bfd/plugin.c
 | |
| +++ b/bfd/plugin.c
 | |
| @@ -291,6 +291,14 @@ bfd_plugin_close_file_descriptor (bfd *abfd, int fd)
 | |
|  	     && !bfd_is_thin_archive (abfd->my_archive))
 | |
|  	abfd = abfd->my_archive;
 | |
|  
 | |
| +      /* Close the file descriptor if there is no archive plugin file
 | |
| +	 descriptor.  */
 | |
| +      if (abfd->archive_plugin_fd == -1)
 | |
| +	{
 | |
| +	  close (fd);
 | |
| +	  return;
 | |
| +	}
 | |
| +
 | |
|        abfd->archive_plugin_fd_open_count--;
 | |
|        /* Dup the archive plugin file descriptor for later use, which
 | |
|  	 will be closed by _bfd_archive_close_and_cleanup.  */
 | |
| diff --git a/ld/testsuite/ld-plugin/lto.exp b/ld/testsuite/ld-plugin/lto.exp
 | |
| index def69e43ab3..999d911ce6a 100644
 | |
| --- a/ld/testsuite/ld-plugin/lto.exp
 | |
| +++ b/ld/testsuite/ld-plugin/lto.exp
 | |
| @@ -687,6 +687,40 @@ if { [is_elf_format] && [check_lto_shared_available] } {
 | |
|      }
 | |
|  }
 | |
|  
 | |
| +run_cc_link_tests [list \
 | |
| +    [list \
 | |
| +	"Build pr28138.a" \
 | |
| +	"-T" "" \
 | |
| +	{pr28138-1.c pr28138-2.c pr28138-3.c pr28138-4.c pr28138-5.c \
 | |
| +	 pr28138-6.c pr28138-7.c} {} "pr28138.a" \
 | |
| +    ] \
 | |
| +    [list \
 | |
| +	"Build pr28138.o" \
 | |
| +	"" "" \
 | |
| +	{pr28138.c} {} \
 | |
| +    ] \
 | |
| +]
 | |
| +
 | |
| +set exec_output [run_host_cmd "sh" \
 | |
| +			      "-c \"ulimit -n 20; \
 | |
| +			      $CC -Btmpdir/ld -o tmpdir/pr28138 \
 | |
| +			      tmpdir/pr28138.o tmpdir/pr28138.a\""]
 | |
| +set exec_output [prune_warnings $exec_output]
 | |
| +if [string match "" $exec_output] then {
 | |
| +    if { [isnative] } {
 | |
| +	set exec_output [run_host_cmd "tmpdir/pr28138" ""]
 | |
| +	if [string match "PASS" $exec_output] then {
 | |
| +	    pass "PR ld/28138"
 | |
| +	} else {
 | |
| +	    fail "PR ld/28138"
 | |
| +	}
 | |
| +    } else {
 | |
| +	pass "PR ld/28138"
 | |
| +    }
 | |
| +} else {
 | |
| +    fail "PR ld/28138"
 | |
| +}
 | |
| +
 | |
|  set testname "Build liblto-11.a"
 | |
|  remote_file host delete "tmpdir/liblto-11.a"
 | |
|  set catch_output [run_host_cmd "$ar" "rc $plug_opt tmpdir/liblto-11.a tmpdir/lto-11a.o tmpdir/lto-11b.o tmpdir/lto-11c.o"]
 | |
| diff --git a/ld/testsuite/ld-plugin/pr28138-1.c b/ld/testsuite/ld-plugin/pr28138-1.c
 | |
| new file mode 100644
 | |
| index 00000000000..51d119e1642
 | |
| --- /dev/null
 | |
| +++ b/ld/testsuite/ld-plugin/pr28138-1.c
 | |
| @@ -0,0 +1,6 @@
 | |
| +extern int a0(void);
 | |
| +int
 | |
| +a1(void)
 | |
| +{
 | |
| +  return 1 + a0();
 | |
| +}
 | |
| diff --git a/ld/testsuite/ld-plugin/pr28138-2.c b/ld/testsuite/ld-plugin/pr28138-2.c
 | |
| new file mode 100644
 | |
| index 00000000000..1120cd797e9
 | |
| --- /dev/null
 | |
| +++ b/ld/testsuite/ld-plugin/pr28138-2.c
 | |
| @@ -0,0 +1,6 @@
 | |
| +extern int a1(void);
 | |
| +int
 | |
| +a2(void)
 | |
| +{
 | |
| +  return 1 + a1();
 | |
| +}
 | |
| diff --git a/ld/testsuite/ld-plugin/pr28138-3.c b/ld/testsuite/ld-plugin/pr28138-3.c
 | |
| new file mode 100644
 | |
| index 00000000000..ec464947ee6
 | |
| --- /dev/null
 | |
| +++ b/ld/testsuite/ld-plugin/pr28138-3.c
 | |
| @@ -0,0 +1,6 @@
 | |
| +extern int a2(void);
 | |
| +int
 | |
| +a3(void)
 | |
| +{
 | |
| +  return 1 + a2();
 | |
| +}
 | |
| diff --git a/ld/testsuite/ld-plugin/pr28138-4.c b/ld/testsuite/ld-plugin/pr28138-4.c
 | |
| new file mode 100644
 | |
| index 00000000000..475701b2c5c
 | |
| --- /dev/null
 | |
| +++ b/ld/testsuite/ld-plugin/pr28138-4.c
 | |
| @@ -0,0 +1,6 @@
 | |
| +extern int a3(void);
 | |
| +int
 | |
| +a4(void)
 | |
| +{
 | |
| +  return 1 + a3();
 | |
| +}
 | |
| diff --git a/ld/testsuite/ld-plugin/pr28138-5.c b/ld/testsuite/ld-plugin/pr28138-5.c
 | |
| new file mode 100644
 | |
| index 00000000000..e24f86c363e
 | |
| --- /dev/null
 | |
| +++ b/ld/testsuite/ld-plugin/pr28138-5.c
 | |
| @@ -0,0 +1,6 @@
 | |
| +extern int a4(void);
 | |
| +int
 | |
| +a5(void)
 | |
| +{
 | |
| +  return 1 + a4();
 | |
| +}
 | |
| diff --git a/ld/testsuite/ld-plugin/pr28138-6.c b/ld/testsuite/ld-plugin/pr28138-6.c
 | |
| new file mode 100644
 | |
| index 00000000000..b5b938bdb21
 | |
| --- /dev/null
 | |
| +++ b/ld/testsuite/ld-plugin/pr28138-6.c
 | |
| @@ -0,0 +1,6 @@
 | |
| +extern int a5(void);
 | |
| +int
 | |
| +a6(void)
 | |
| +{
 | |
| +  return 1 + a5();
 | |
| +}
 | |
| diff --git a/ld/testsuite/ld-plugin/pr28138-7.c b/ld/testsuite/ld-plugin/pr28138-7.c
 | |
| new file mode 100644
 | |
| index 00000000000..4ef75bf0f0c
 | |
| --- /dev/null
 | |
| +++ b/ld/testsuite/ld-plugin/pr28138-7.c
 | |
| @@ -0,0 +1,6 @@
 | |
| +extern int a6(void);
 | |
| +int
 | |
| +a7(void)
 | |
| +{
 | |
| +  return 1 + a6();
 | |
| +}
 | |
| diff --git a/ld/testsuite/ld-plugin/pr28138.c b/ld/testsuite/ld-plugin/pr28138.c
 | |
| new file mode 100644
 | |
| index 00000000000..68252c9f382
 | |
| --- /dev/null
 | |
| +++ b/ld/testsuite/ld-plugin/pr28138.c
 | |
| @@ -0,0 +1,20 @@
 | |
| +#include <stdio.h>
 | |
| +
 | |
| +extern int a7(void);
 | |
| +
 | |
| +int
 | |
| +a0(void)
 | |
| +{
 | |
| +  return 0;
 | |
| +}
 | |
| +
 | |
| +int
 | |
| +main()
 | |
| +{
 | |
| +  if (a7() == 7)
 | |
| +    {
 | |
| +      printf ("PASS\n");
 | |
| +      return 0;
 | |
| +    }
 | |
| +  return 1;
 | |
| +}
 | |
| -- 
 | |
| 2.27.0
 |