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...@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 _______________________________________________ Tinycc-devel mailing list Tinycc-devel@nongnu.org https://lists.nongnu.org/mailman/listinfo/tinycc-devel