tinycc-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Tinycc-devel] Enabling TinyCC to Create Empty Archives


From: Ziyao
Subject: Re: [Tinycc-devel] Enabling TinyCC to Create Empty Archives
Date: Tue, 12 Apr 2022 15:01:54 +0800

On Mon, Apr 04, 2022 at 11:03:11AM +0800, Ziyao wrote:
> Hi list,
> 
> On my machine (x86_64 Ubuntu 18.04LTS,GNU ar 2.30),it is OK to create an
> empty archive with
>       ar rc libempty.a
> This will create libempty.a which only contains an ar archive header.
> 
> But TinyCC refuses to do that:
>       tcc -ar rc libempty.a   # This will print the usage
> I made a patch for that.

I recently found that after applying the patch,creating an empty archive
in the above way will make TinyCC return 2,which breaks the building
progress of make.

A new fix is contained in this mail.

Best wishes,
Ziyao

---

diff --git a/tcctools.c b/tcctools.c
index 4567b81..2bcc990 100644
--- a/tcctools.c
+++ b/tcctools.c
@@ -61,7 +61,7 @@ static int contains_any(const char *s, const char *list) {
 }
 
 static int ar_usage(int ret) {
-    fprintf(stderr, "usage: tcc -ar [rcsv] lib file...\n");
+    fprintf(stderr, "usage: tcc -ar [rcsv] lib [file...]\n");
     fprintf(stderr, "create library ([abdioptxN] not supported).\n");
     return ret;
 }
@@ -115,8 +115,9 @@ ST_FUNC int tcc_tool_ar(TCCState *s1, int argc, char **argv)
         }
     }
 
-    if (!i_obj)  // i_obj implies also i_lib. we require both.
+    if (!i_lib)  // i_obj implies also i_lib.
         ret = 1;
+    i_obj = i_obj ? i_obj : argc;  // An empty archive will be generated if no 
input file is given
 
     if (ret == 1)
         return ar_usage(ret);
@@ -242,6 +243,11 @@ ST_FUNC int tcc_tool_ar(TCCState *s1, int argc, char 
**argv)
         hofs++, fpos = 1;
     // write header
     fwrite("!<arch>\n", 8, 1, fh);
+    // create an empty archive
+    if (!funccnt) {
+        ret = 0;
+        goto the_end;
+    }
     sprintf(stmp, "%-10d", (int)(strpos + (funccnt+1) * sizeof(int)));
     memcpy(&arhdr.ar_size, stmp, 10);
     fwrite(&arhdr, sizeof(arhdr), 1, fh);




reply via email to

[Prev in Thread] Current Thread [Next in Thread]