[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Tinycc-devel] Enabling TinyCC to Create Empty Archives
From: |
Christian Jullien |
Subject: |
Re: [Tinycc-devel] Enabling TinyCC to Create Empty Archives |
Date: |
Mon, 4 Apr 2022 08:13:33 +0200 |
Hi,
As you need to update your Makefile to replace ar by 'tcc ar' you can as well
replace the command that produce an empty archive by:
echo '!<arch>' > libempty.a.
This works even in the case you use gcc.
Your patch is small and looks good too. Maybe maintainer will want to accept it.
It's a good thing for tcc to mimic gcc/ar/... behaviors
M2c
-----Original Message-----
From: Tinycc-devel [mailto:tinycc-devel-bounces+eligis=orange.fr@nongnu.org] On
Behalf Of Ziyao
Sent: Monday, April 04, 2022 05:03
To: tinycc-devel@nongnu.org
Subject: [Tinycc-devel] Enabling TinyCC to Create Empty Archives
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.
musl libc uses this feature to create dummy libraries(it combines all
libraries into a single file,rather than many libraries like libc.a,libm.a
etc.Dummy libraries are used to avoid linking errors when using common
linking flags like -lm).
I do not know whether there are other projects using this feature.But I
think it is a good idea to keep compatible with GNU ar.
Best wishes,
Ziyao
---------
diff --git a/tcctools.c b/tcctools.c
index 4567b81..7c643dc 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,9 @@ 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)
+ goto the_end;
sprintf(stmp, "%-10d", (int)(strpos + (funccnt+1) * sizeof(int)));
memcpy(&arhdr.ar_size, stmp, 10);
fwrite(&arhdr, sizeof(arhdr), 1, fh);
_______________________________________________
Tinycc-devel mailing list
Tinycc-devel@nongnu.org
https://lists.nongnu.org/mailman/listinfo/tinycc-devel