cmd/link: specify -Wl,-z params as documented

Both GNU and LLVM linkers de facto accept `-zPARAM`, and Go sometimes
does it. Inconsistently: there are more uses of `-z PARAM` than
`-zPARAM`:

    $ git grep -h -- '-Wl,-z' master | cut -b-76
            re(`-Wl,-z,(no)?execstack`),
            re(`-Wl,-z,relro`),
                                    argv = append(argv, "-Wl,-z,relro")
                                    argv = append(argv, "-Wl,-z,relro")
                                    argv = append(argv, "-Wl,-z,nodelete")
                            argv = append(argv, "-Wl,-z,relro")
                                    argv = append(argv, "-Wl,-z,relro")
                    argv = append(argv, "-Wl,-znow")
                    argv = append(argv, "-Wl,-znocopyreloc")

However, not adding a space between `-z` and the param is not
documented:

llvm-13:

    $ man ld.lld-13 | grep -E -A1 -w -- "^ +-z"
         -z option
                 Linker option extensions.

gnu ld:

    $ man ld | grep -E -A1 -w -- "^ +-z"
           -z keyword
               The recognized keywords are:
    --
           -z defs
               Report unresolved symbol references from regular object files.  This is done even if the linker is creating a non-symbolic
    --
           -z muldefs
               Normally when a symbol is defined multiple times, the linker will report a fatal error. These options allow multiple definitions
    --
           -z
           --imagic

... and thus should be avoided.

`zig cc`, when used as the C compiler (`CC="zig cc" go build ...`), will
bark, because `zig cc` accepts only `-z PARAM`.

Closes ziglang/zig#11669
This commit is contained in:
Motiejus Jakštys 2022-05-23 13:26:41 +03:00
parent 46ab7a5c4f
commit e068e007da

View file

@ -1463,12 +1463,12 @@ func (ctxt *Link) hostlink() {
// We force all symbol resolution to be done at program startup
// because lazy PLT resolution can use large amounts of stack at
// times we cannot allow it to do so.
argv = append(argv, "-Wl,-znow")
argv = append(argv, "-Wl,-z,now")
// Do not let the host linker generate COPY relocations. These
// can move symbols out of sections that rely on stable offsets
// from the beginning of the section (like sym.STYPE).
argv = append(argv, "-Wl,-znocopyreloc")
argv = append(argv, "-Wl,-z,nocopyreloc")
if buildcfg.GOOS == "android" {
// Use lld to avoid errors from default linker (issue #38838)