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 Initial Version
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
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:
pt/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.