Opened 5 years ago
Last modified 5 years ago
#58493 closed defect
cctools: using clang < 5.0 as default assembler generates assembly errors in some cases — at Version 1
Reported by: | kencu (Ken) | Owned by: | jeremyhu (Jeremy Huddleston Sequoia) |
---|---|---|---|
Priority: | Normal | Milestone: | |
Component: | ports | Version: | |
Keywords: | Cc: | jmroot (Joshua Root), cjones051073 (Chris Jones) | |
Port: | cctools |
Description (last modified by kencu (Ken))
To fix errors in newer ports that require gcc (fortran) to assemble newer assembly, the as
in cctools
was modified to send the assembly to a specific version of clang
for processing, if present. For SnowLeopard, that default clang
version is clang-3.4
.
It turns out there is (at least one) bug in the clang
i386 assembler that was not fixed until after clang-3.7
. It is fixed in clang-5.0
. This error shows up during the build or bootstrapping of gcc / libgcc
, and perhaps will turn up elsewhere:
/opt/local/i386-apple-darwin10/bin/ -nostdinc++ -B/opt/local/var/macports/build/_opt_macports-ports_lang_gcc9/libgcc9/work/build/prev-i386-apple-darwin10/libstdc++-v3/src/.libs -B/opt/local/var/macports/build/_opt_macports-ports_lang_gcc9/libgcc9/work/build/prev-i386-apple-darwin10/libstdc++-v3/libsupc++/.libs -isystem /opt/local/var/macports/build/_opt_macports-ports_lang_gcc9/libgcc9/work/build/prev-i386-apple-darwin10/libstdc++-v3/include/i386-apple-darwin10 -isystem /opt/local/var/macports/build/_opt_macports-ports_lang_gcc9/libgcc9/work/build/prev-i386-apple-darwin10/libstdc++-v3/include -isystem /opt/local/var/macports/build/_opt_macports-ports_lang_gcc9/libgcc9/work/gcc-9.1.0/libstdc++-v3/libsupc++ -L/opt/local/var/macports/build/_opt_macports-ports_lang_gcc9/libgcc9/work/build/prev-i386-apple-darwin10/libstdc++-v3/src/.libs -L/opt/local/var/macports/build/_opt_macports-ports_lang_gcc9/libgcc9/work/build/prev-i386-apple-darwin10/libstdc++-v3/libsupc++/.libs -g -O2 -fno-checking -mdynamic-no-pic -gtoggle -DIN_GCC -fno-exceptions -fno-rtti -fasynchronous-unwind-tables -W -Wall -Wno-narrowing -Wwrite-strings -Wcast-qual -Wmissing-format-attribute -Woverloaded-virtual -pedantic -Wno-long-long -Wno-variadic-macros -Wno-overlength-strings -DHAVE_CONFIG_H -static-libstdc++ -static-libgcc -o cc1 c/c-lang.o c-family/stub-objc.o attribs.o c/c-errors.o c/c-decl.o c/c-typeck.o c/c-convert.o c/c-aux-info.o c/c-objc-common.o c/c-parser.o c/c-fold.o c/gimple-parser.o c-family/c-common.o c-family/c-cppbuiltin.o c-family/c-dump.o c-family/c-format.o c-family/c-gimplify.o c-family/c-indentation.o c-family/c-lex.o c-family/c-omp.o c-family/c-opts.o c-family/c-pch.o c-family/c-ppoutput.o c-family/c-pragma.o c-family/c-pretty-print.o c-family/c-semantics.o c-family/c-ada-spec.o c-family/c-ubsan.o c-family/known-headers.o c-family/c-attribs.o c-family/c-warn.o c-family/c-spellcheck.o i386-c.o darwin-c.o \ cc1-checksum.o libbackend.a main.o libcommon-target.a libcommon.a ../libcpp/libcpp.a ../libdecnumber/libdecnumber.a libcommon.a ../libcpp/libcpp.a -liconv ../libbacktrace/.libs/libbacktrace.a ../libiberty/libiberty.a ../libdecnumber/libdecnumber.a -L/opt/local/lib -lisl -L/opt/local/lib -L/opt/local/lib -L/opt/local/lib -lmpc -lmpfr -lgmp -lz ld: in libbackend.a(i386.o), in section __TEXT,__text reloc 5479: unsupported r_length=0 for scattered vanilla reloc for architecture i386
This is a known clang assembler error <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63773>.
There is a reduced test case for it:
.text .align 4,0x90 .globl _choose_tmpdir _choose_tmpdir: sbbl $3+_vartmp, %esi ret .space 254 .const .align 2 _vartmp: .byte 47
and I confirm that clang-3.4
and clang-3.7
error out on this assembly, but clang-5.0
can compile it successfully:
$ clang-mp-3.4 -arch i386 testi386asm.S ld: in /var/folders/If/IfyiELboGT08qyd+9nD3DU+++TI/-Tmp-/testi386asm-fc6237.o, in section __TEXT,__text reloc 0: unsupported r_length=0 for scattered vanilla reloc for architecture i386 clang: error: linker command failed with exit code 1 (use -v to see invocation) $ clang-mp-3.7 -arch i386 testi386asm.S ld: in /var/folders/If/IfyiELboGT08qyd+9nD3DU+++TI/-Tmp-/testi386asm-c2fa0b.o, in section __TEXT,__text reloc 0: unsupported r_length=0 for scattered vanilla reloc for architecture i386 clang: error: linker command failed with exit code 1 (use -v to see invocation) $ clang-mp-5.0 -arch i386 testi386asm.S Undefined symbols for architecture i386: "_main", referenced from: start in crt1.10.6.o ld: symbol(s) not found for architecture i386 clang: error: linker command failed with exit code 1 (use -v to see invocation)
Likewise, the same assembly generates errors when compiling in x86_64
mode.
$ clang-mp-3.4 -arch x86_64 testi386asm.S ld: in /var/folders/If/IfyiELboGT08qyd+9nD3DU+++TI/-Tmp-/testi386asm-07fc5b.o, in section __TEXT,__text reloc 0: length < 2 and X86_64_RELOC_UNSIGNED not supported for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation) $ clang-mp-3.7 -arch x86_64 testi386asm.S ld: in /var/folders/If/IfyiELboGT08qyd+9nD3DU+++TI/-Tmp-/testi386asm-52d45e.o, in section __TEXT,__text reloc 0: length < 2 and X86_64_RELOC_UNSIGNED not supported for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation) $ clang-mp-5.0 -arch x86_64 testi386asm.S Undefined symbols for architecture x86_64: "_main", referenced from: start in crt1.10.6.o ld: symbol(s) not found for architecture x86_64
So - it appears that clang
should not be used as the default assembler unless it is clang-5.0
or greater, and for the system clang
should not be used (according to the gcc bug report) unless the Xcode version is at least 7.3.1
.
This probably requires only a rather minor adjustment to the cctools
port.