diff options
author | Fangrui Song <i@maskray.me> | 2022-02-09 00:59:53 +0000 |
---|---|---|
committer | Ed Maste <emaste@FreeBSD.org> | 2022-02-09 18:54:35 +0000 |
commit | ec81497cc7260b26c2af615c54aa80f515d6c539 (patch) | |
tree | 6b2ddcea5b36f040662adff9f7075b1d7bc1cbb7 | |
parent | d73d40c17f890518d6a58f4c3a36c9acbcb34bb0 (diff) | |
download | src-ec81497cc7260b26c2af615c54aa80f515d6c539.tar.gz src-ec81497cc7260b26c2af615c54aa80f515d6c539.zip |
crunchgen: remove -dc from linker invocation
In GNU ld and ld.lld, -dc is used with -r to allocate space to COMMON
symbols. It is presumably to work around legacy code which cannot
handle COMMON symbols in relocatable output. ld.lld may remove -dc or
make it a no-op for the 15.0.0 release.
As of 7420b323a014 crunch/crunchide does not require -dc, as the symbol
hiding technique no longer relied on making symbols local.
In addition -fno-common is now the default in Clang and GCC, so -dc
serves no purpose as the compiler does not generate COMMON symbols
anyway.
See https://maskray.me/blog/2022-02-06-all-about-common-symbols for more
detail on common symbols.
Reviewed by: emaste
MFC after: 1 week
Differential Revision: https://reviews.freebsd.org/D34215
-rw-r--r-- | usr.sbin/crunch/crunchgen/crunchgen.c | 2 | ||||
-rw-r--r-- | usr.sbin/crunch/crunchide/crunchide.c | 6 |
2 files changed, 3 insertions, 5 deletions
diff --git a/usr.sbin/crunch/crunchgen/crunchgen.c b/usr.sbin/crunch/crunchgen/crunchgen.c index 89d549b18b4e..63ce727496b7 100644 --- a/usr.sbin/crunch/crunchgen/crunchgen.c +++ b/usr.sbin/crunch/crunchgen/crunchgen.c @@ -1123,7 +1123,7 @@ prog_makefile_rules(FILE *outmk, prog_t *p) fprintf(outmk, " $(%s_LIBS)", p->ident); fprintf(outmk, "\n"); - fprintf(outmk, "\t$(CC) -nostdlib -Wl,-dc -r -o %s.lo %s_stub.o $(%s_OBJPATHS)", + fprintf(outmk, "\t$(CC) -nostdlib -r -o %s.lo %s_stub.o $(%s_OBJPATHS)", p->name, p->name, p->ident); if (p->libs) fprintf(outmk, " $(%s_LIBS)", p->ident); diff --git a/usr.sbin/crunch/crunchide/crunchide.c b/usr.sbin/crunch/crunchide/crunchide.c index 1f2f98893bac..bd663e1d57bd 100644 --- a/usr.sbin/crunch/crunchide/crunchide.c +++ b/usr.sbin/crunch/crunchide/crunchide.c @@ -28,9 +28,7 @@ /* * crunchide.c - tiptoes through a symbol table, hiding all defined * global symbols. Allows the user to supply a "keep list" of symbols - * that are not to be hidden. This program relies on the use of the - * linker's -dc flag to actually put global bss data into the file's - * bss segment (rather than leaving it as undefined "common" data). + * that are not to be hidden. * * The point of all this is to allow multiple programs to be linked * together without getting multiple-defined errors. @@ -40,7 +38,7 @@ * int foo_main(int argc, char **argv){ return main(argc, argv); } * like so: * cc -c foo.c foostub.c - * ld -dc -r foo.o foostub.o -o foo.combined.o + * ld -r foo.o foostub.o -o foo.combined.o * crunchide -k _foo_main foo.combined.o * at this point, foo.combined.o can be linked with another program * and invoked with "foo_main(argc, argv)". foo's main() and any |