ar: Add --thin for creating thin archives
authorFangrui Song <maskray@google.com>
Tue, 11 Jan 2022 16:59:40 +0000 (08:59 -0800)
committerFangrui Song <maskray@google.com>
Tue, 11 Jan 2022 16:59:40 +0000 (08:59 -0800)
In many ar implementations (FreeBSD, elfutils, etc), -T has the X/Open
System Interface specified semantics. Therefore -T for thin archives is
not recommended for portability. -T is deprecated without diagnostics.

    PR binutils/28759
    * ar.c (long_options): Add --thin.
    (usage) Add --thin. Deprecate -T without diagnostics.
    * doc/binutils.texi: Add doc.
    * NEWS: Mention --thin.
    * binutils/testsuite/binutils-all/ar.exp: Add tests.

binutils/ChangeLog
binutils/NEWS
binutils/ar.c
binutils/doc/binutils.texi
binutils/testsuite/binutils-all/ar.exp

index 8e31f1472cc85f09b7a6148c577f99d54cfb1590..9c2c3e557778caf293975e434bee00cc33bbbb2b 100644 (file)
@@ -1,3 +1,12 @@
+2022-01-11  Fangrui Song  <maskray@google.com>
+
+       PR binutils/28759
+       * ar.c (long_options): Add --thin.
+       (usage) Add --thin. Deprecate -T without diagnostics.
+       * doc/binutils.texi: Add doc.
+       * NEWS: Mention --thin.
+       * binutils/testsuite/binutils-all/ar.exp: Add tests.
+
 2022-01-11  Martin Storsjö  <martin@martin.st>
 
        * dlltool.c (main): If a prefix has not been provided, attempt to
index 903f8233b996894deaf1b1553b95d395a4224b3e..ffba42ccd5e86c5506d2dcdfcb17114cfd0301f2 100644 (file)
 * 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 a deprecated alias without
+  diagnostics. In many ar implementations -T has a different meaning, as
+  specified by X/Open System Interface.
+
 Changes in 2.37:
 
 * The readelf tool has a new command line option which can be used to specify
index d7d2fc21dd933b639e82db02483fab8012e3277e..0d4c7cf16a6538f315c7cc02372bfb86a9253d3b 100644 (file)
@@ -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}
 };
 
@@ -337,13 +338,14 @@ usage (int help)
   fprintf (s, _("  [s]          - create an archive index (cf. ranlib)\n"));
   fprintf (s, _("  [l <text> ]  - specify the dependencies of this library\n"));
   fprintf (s, _("  [S]          - do not build a symbol table\n"));
-  fprintf (s, _("  [T]          - make a thin archive\n"));
+  fprintf (s, _("  [T]          - deprecated, use --thin instead\n"));
   fprintf (s, _("  [v]          - be verbose\n"));
   fprintf (s, _("  [V]          - display the version number\n"));
   fprintf (s, _("  @<file>      - read options from <file>\n"));
   fprintf (s, _("  --target=BFDNAME - specify the target object format as BFDNAME\n"));
   fprintf (s, _("  --output=DIRNAME - specify the output directory for extraction operations\n"));
   fprintf (s, _("  --record-libdeps=<text> - specify the dependencies of this library\n"));
+  fprintf (s, _("  --thin       - make a thin archive\n"));
 #if BFD_SUPPORTS_PLUGINS
   fprintf (s, _(" optional:\n"));
   fprintf (s, _("  --plugin <p> - load the specified plugin\n"));
index 446c275a5db8fe383c85f7e2967c51853590dd60..54845c5dc086f21f7a26a0302dc4436fd44032ad 100644 (file)
@@ -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}.
+Deprecated alias for @option{--thin}.  @option{T} is not recommended because in
+many ar implementations @option{T} has a different meaning, as specified by
+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
 
index 12aa079865b2655ca60e909e7c60b770afea7c8d..3b841825f6f0b93d7efd64859960a839cb43506e 100644 (file)
@@ -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"]