Why https://ci.freebsd.org/job/FreeBSD-head-amd64-gcc builds are failing . . .

Mark Millard marklmi26-fbsd at yahoo.com
Sun Apr 22 02:00:52 UTC 2018

/usr/local/bin/x86_64-freebsd-ld: unrecognized option '--no-rosegment'

is the message that reports what stops the build. I think this traces
back to:

/usr/src/share/mk/bsd.sys.mk:LDFLAGS+=  ${LDFLAGS.${LINKER_TYPE}}

being incorrect for an amd64-gcc / x86_64-freebsd-ld based build.

The details for how I got to that follow.

Looking around . . .

# grep -r rosegment /usr/src/* | more
/usr/src/contrib/llvm/tools/lld/ELF/Writer.cpp:  //   -no-rosegment option is used.
/usr/src/contrib/llvm/tools/lld/ELF/Options.td:def no_rosegment: F<"no-rosegment">,
/usr/src/contrib/llvm/tools/lld/ELF/ScriptParser.cpp:  // -no-rosegment is used to avoid placing read only non-executable sections in
/usr/src/contrib/llvm/tools/lld/ELF/SyntheticSections.cpp:  // for that case, which happens only when -no-rosegment is given.
/usr/src/contrib/llvm/tools/lld/ELF/Driver.cpp:  Config->SingleRoRx = Args.hasArg(OPT_no_rosegment);
/usr/src/stand/i386/Makefile.inc:LDFLAGS.lld+=  -Wl,--no-rosegment
/usr/src/usr.bin/clang/lld/ld.lld.1:.It Fl -no-rosegment

Note the line: /usr/src/stand/i386/Makefile.inc:LDFLAGS.lld+=  -Wl,--no-rosegment
which seems to be the only place that the --no-rosegment could be from.

The error report detail is:

===> stand/i386/mbr (all)
--- machine ---
machine -> /workspace/src/sys/i386/include
--- x86 ---
x86 -> /workspace/src/sys/x86/include
--- mbr.o ---
as  --defsym FLAGS=0x80 --32  -o mbr.o /workspace/src/stand/i386/mbr/mbr.s
--- mbr ---
/usr/local/bin/x86_64-unknown-freebsd11.1-gcc -isystem /workspace/obj/workspace/src/amd64.amd64/tmp/usr/include -L/workspace/obj/workspace/src/amd64.amd64/tmp/usr/lib -B/workspace/obj/workspace/src/amd64.amd64/tmp/usr/lib --sysroot=/workspace/obj/workspace/src/amd64.amd64/tmp -B/workspace/obj/workspace/src/amd64.amd64/tmp/usr/bin -O2 -pipe -I/workspace/src/stand/i386/btx/lib -nostdinc -I/workspace/obj/workspace/src/amd64.amd64/stand/libsa32 -I/workspace/src/stand/libsa -D_STANDALONE -I/workspace/src/sys -Ddouble=jagged-little-pill -Dfloat=floaty-mcfloatface -DLOADER_DISK_SUPPORT -m32 -mcpu=i386 -ffreestanding -mno-mmx -mno-sse -msoft-float -march=i386 -I. -std=gnu99 -Wsystem-headers -Werror -Wno-pointer-sign -Wno-error=address -Wno-error=array-bounds -Wno-error=attributes -Wno-error=bool-compare -Wno-error=cast-align -Wno-error=clobbered -Wno-error=enum-compare -Wno-error=extra -Wno-error=inline -Wno-error=logical-not-parentheses -Wno-error=strict-aliasing -Wno-error=uninitialized -Wno-error=unused-but-set-variable -Wno-error=unused-function -Wno-error=unused-value -Wno-error=misleading-indentation -Wno-error=nonnull-compare -Wno-error=shift-negative-value -Wno-error=tautological-compare -Wno-error=unused-const-variable -mpreferred-stack-boundary=2  -e start -Ttext 0x600 -Wl,-N,-S,--oformat,binary -nostdlib -Wl,--no-rosegment -o mbr mbr.o  
x86_64-unknown-freebsd11.1-gcc: warning: '-mcpu=' is deprecated; use '-mtune=' or '-march=' instead
/usr/local/bin/x86_64-freebsd-ld: unrecognized option '--no-rosegment'
/usr/local/bin/x86_64-freebsd-ld: use the --help option for usage information
collect2: error: ld returned 1 exit status
*** [mbr] Error code 1

It appears that, for a amd64-gcc build that is using /usr/local/bin/x86_64-freebsd-ld
via x86_64-unknown-freebsd11.1-gcc , for some reason LDFLAGS.lld content is using used.

This suggests that in:

/usr/src/share/mk/bsd.sys.mk:LDFLAGS+=  ${LDFLAGS.${LINKER_TYPE}}

LINKER_TYPE is "lld". In turn that would seem to be from:

/usr/src/share/mk/bsd.linker.mk:${X_}LINKER_TYPE=       lld

Or with more context and indented but inside a
".for ld X_ in LD $${_empty_var_} XLD X_":

.if ${ld} == "LD" || (${ld} == "XLD" && ${XLD} != ${LD})
  .if !defined(${X_}LINKER_TYPE) || !defined(${X_}LINKER_VERSION)
    _ld_version!=   (${${ld}} --version || echo none) | head -n 1
    . . .
    .elif ${_ld_version:[1]} == "LLD"
      ${X_}LINKER_TYPE=       lld
      _v=     ${_ld_version:[2]}
    . . .
  . . .
.endif  # ${ld} == "LD" || (${ld} == "XLD" && ${XLD} != ${LD})

So it seems that ${${ld}} picked out lld for assigning _ld_version .
In turn, the following what apparently executed:

    .elif ${_ld_version:[1]} == "LLD"
      ${X_}LINKER_TYPE=       lld
      _v=     ${_ld_version:[2]}

But for (again):

/usr/src/share/mk/bsd.sys.mk:LDFLAGS+=  ${LDFLAGS.${LINKER_TYPE}}

that implies that the case involved is:

ld X_ in LD $${_empty_var_}

It looks like the LDFLAGS+= should not be using that for this type
of build.

Mark Millard
marklmi at yahoo.com
( dsl-only.net went
away in early 2018-Mar)

More information about the freebsd-amd64 mailing list