Ideally I want to append flags to the default gcc specs file, and set
flags there, without rebuilding GCC toolchain.
I started with a simple specs file which only does:
```
*self_spec:
+ -fhardened
```
When invoking g++-14 like this:
$ g++-14 -v -specs ./specs /dev/zero
Things are fine, specifically the flag I specified is in effect, as in:
COLLECT_GCC_OPTIONS='-v' '-specs=./specs' '-foffload-options=-l_GCC_m'
'-shared-libgcc' '-mtune=generic' '-march=x86-64' '-fhardened'
'-dumpdir' 'a.'
has -fhardened, and the rest of the options are correct too.
Specifically the command ends with "/dev/zero -lstdc++ -lm -lgcc_s
-lgcc -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-linux-gnu/14/crtendS.o
/usr/lib/gcc/x86_64-linux-gnu/14/../../../x86_64-linux-gnu/crtn.o" as
expected
Once I was very happy with this spec, I was hoping that I can move
this specs file into /usr/lib/gcc/x86_64-linux-gnu/14/specs such that
it will be always activated.... and it did.
Reading specs from /usr/lib/gcc/x86_64-linux-gnu/14/specs
COLLECT_GCC_OPTIONS='-v' '-foffload-options=-l_GCC_m' '-shared-libgcc'
'-mtune=generic' '-march=x86-64' '-fhardened' '-dumpdir' 'a.'
And so on.
But I got an unexpected side-effect. As the overall command now ends with
"/dev/zero -lstdc++ -lm -lgcc -lc -lgcc
/usr/lib/gcc/x86_64-linux-gnu/14/crtendS.o
/usr/lib/gcc/x86_64-linux-gnu/14/../../../x86_64-linux-gnu/crtn.o"
Notice how the libraries between /dev/zero and crtendS.o are now
different with -lgcc_s now gone.
If I add into specs file this snippet from dumpspecs
```
*libgcc:
%{static|static-libgcc|static-pie:-lgcc
-lgcc_eh}%{!static:%{!static-libgcc:%{!static-pie:%{!shared-libgcc:-lgcc
--push-state --as-needed -lgcc_s
--pop-state}%{shared-libgcc:-lgcc_s%{!shared: -lgcc}}}}}
*self_spec:
+ -fhardened
```
The command lines generate now look as before. But I fear that my
modifications to "specs" like that is not a good way of doing this. It
seems like it may need to include full contents of "dumpspecs" in
addition to any further customisations, and it really is not
equivalent to a "default built-in location equivalent to -specs arg".
Is this expected? Is /usr/lib/gcc/x86_64-linux-gnu/14/specs not a
good place to do self_spec override? Is there any other way to preset
default self_spec? Should I do something else - i.e. configure GCC
using `--with-specs=%:include(myspecs)` and then ensure said file
always exists, and specify custom flags there?
Ultimately I am trying to experience similarish to clang toolchain
which allows creating .cfg file with any custom commandline settings.
Regards,
Dimitri.