[PATCH] ar: Add --thin for creating thin archives

Fangrui Song maskray@google.com
Mon Jan 10 21:49:08 GMT 2022


On 2022-01-10, Fangrui Song wrote:
>In many ar implementations (FreeBSD, elfutils, etc), ar -T has the
>X/Open System Interface specified semantics. Therefore -T for thin
>archives is not recommended for portability.
>
>    PR binutils/28759
>    * ar.c (long_options): Add --thin.
>    * binutils/testsuite/binutils-all/ar.exp: Add tests.
>    * NEWS: Mention --thin.
>---
> binutils/NEWS                          |  4 ++++
> binutils/ar.c                          |  1 +
> binutils/testsuite/binutils-all/ar.exp | 17 +++++++++++++++++
> 3 files changed, 22 insertions(+)
>
>diff --git a/binutils/NEWS b/binutils/NEWS
>index 903f8233b99..9598930b581 100644
>--- a/binutils/NEWS
>+++ b/binutils/NEWS
>@@ -18,6 +18,10 @@
> * Support for efi-app-aarch64, efi-rtdrv-aarch64 and efi-bsdrv-aarch64 has been
>   added to objcopy in order to enable UEFI development using binutils.
>
>+* ar: Add --thin for creating thin archives. -T is not recommended for
>+  portability because in many ar implementations -T has a different meaning
>+  from X/Open System Interface.
>+
> Changes in 2.37:
>
> * The readelf tool has a new command line option which can be used to specify
>diff --git a/binutils/ar.c b/binutils/ar.c
>index d7d2fc21dd9..ba710ee426d 100644
>--- a/binutils/ar.c
>+++ b/binutils/ar.c
>@@ -172,6 +172,7 @@ static struct option long_options[] =
>   {"version", no_argument, &show_version, 1},
>   {"output", required_argument, NULL, OPTION_OUTPUT},
>   {"record-libdeps", required_argument, NULL, 'l'},
>+  {"thin", no_argument, NULL, 'T'},
>   {NULL, no_argument, NULL, 0}
> };
>
>diff --git a/binutils/testsuite/binutils-all/ar.exp b/binutils/testsuite/binutils-all/ar.exp
>index 12aa079865b..3b841825f6f 100644
>--- a/binutils/testsuite/binutils-all/ar.exp
>+++ b/binutils/testsuite/binutils-all/ar.exp
>@@ -309,11 +309,13 @@ proc thin_archive_with_nested { bfdtests } {
>     if [is_remote host] {
> 	set archive artest.a
> 	set archive2 artest2.a
>+	set archive3 artest3.a
> 	set objfile [remote_download host tmpdir/bintest.${obj}]
> 	remote_file host delete $archive
>     } else {
> 	set archive tmpdir/artest.a
> 	set archive2 tmpdir/artest2.a
>+	set archive3 tmpdir/artest3.a
> 	set objfile tmpdir/bintest.${obj}
>     }
>
>@@ -333,6 +335,14 @@ proc thin_archive_with_nested { bfdtests } {
> 	return
>     }
>
>+    remote_file build delete tmpdir/artest3.a
>+
>+    set got [binutils_run $AR "rc --thin $archive3 ${archive}"]
>+    if ![string match "" $got] {
>+	fail $testname
>+	return
>+    }
>+
>     foreach bfdtest $bfdtests {
> 	set exec_output [binutils_run "$base_dir/$bfdtest" "$archive"]
> 	if ![string match "" $exec_output] {
>@@ -347,6 +357,13 @@ proc thin_archive_with_nested { bfdtests } {
> 	    fail "$testname ($bfdtest)"
> 	    return
> 	}
>+
>+	set exec_output [binutils_run "$base_dir/$bfdtest" "$archive3"]
>+	if ![string match "" $exec_output] {
>+	    verbose -log $exec_output
>+	    fail "$testname ($bfdtest)"
>+	    return
>+	}
>     }
>
>     set got [binutils_run $NM "--print-armap $archive"]
>-- 
>2.34.1.575.g55b058a8bb-goog

Append the documentation update:


--- i/binutils/doc/binutils.texi
+++ w/binutils/doc/binutils.texi
@@ -256,7 +256,7 @@ program.
  
  @smallexample
  @c man begin SYNOPSIS ar
-ar [@option{-X32_64}] [@option{-}]@var{p}[@var{mod}] [@option{--plugin} @var{name}] [@option{--target} @var{bfdname}] [@option{--output} @var{dirname}] [@option{--record-libdeps} @var{libdeps}] [@var{relpos}] [@var{count}] @var{archive} [@var{member}@dots{}]
+ar [@option{-X32_64}] [@option{-}]@var{p}[@var{mod}] [@option{--plugin} @var{name}] [@option{--target} @var{bfdname}] [@option{--output} @var{dirname}] [@option{--record-libdeps} @var{libdeps}] [@option{--thin}] [@var{relpos}] [@var{count}] @var{archive} [@var{member}@dots{}]
  @c man end
  @end smallexample
  
@@ -507,10 +507,9 @@ with the linker.  In order to build a symbol table, you must omit the
  @samp{ranlib} on the archive.
  
  @item T
-@cindex creating thin archive
-Make the specified @var{archive} a @emph{thin} archive.  If it already
-exists and is a regular archive, the existing members must be present
-in the same directory as @var{archive}.
+Alias for @option{--thin} for compatibility. @option{T} is not recommended
+because in many ar implementations @option{T} has a different meaning from
+X/Open System Interface.
  
  @item u
  @cindex updating an archive
@@ -603,6 +602,12 @@ line.
  The @option{--record-libdeps} option is identical to the @option{l} modifier,
  just handled in long form.
  
+@item --thin
+@cindex creating thin archive
+Make the specified @var{archive} a @emph{thin} archive.  If it already
+exists and is a regular archive, the existing members must be present
+in the same directory as @var{archive}.
+
  @end table
  @c man end


More information about the Binutils mailing list