[cfe-dev] sparcv9 .gcc_except_table (section): offset (odd number) is non-aligned
Dave Vitek via cfe-dev
cfe-dev at lists.llvm.org
Fri Apr 20 07:11:17 PDT 2018
I've found a potential solution here: Use the gnu binutils linker. It
seems to be less picky than the sun linker about alignment of the
offending relocations. My sparc takes about 80 hours to build clang, so
I'll know more about whether the next bootstrap stage went well in about
70 hours.
Another workaround is to change clang to use:
.cfi_lsda 0, .Lexception0
Instead of:
.cfi_lsda 27, .Lexception0
for various relocations in the assembly. Setting LSDAEncoding to
dwarf::DW_EH_PE_absptr in MCObjectFileInfo::initELFMCObjectFileInfo
might be how one would do this. But this isn't great for PIC. I guess
the real fix would be to change the integrated assembler to place the
relocations at aligned offsets.
On 4/19/2018 3:28 PM, Dave Vitek via cfe-dev wrote:
> Hi all,
>
> I have encountered some linker errors trying to build a small 64-bit
> sparc/solaris10 c++ test program using a freshly built clang 6.0.0 on
> sparc/solaris10. I suspect either the compiler or the integrated
> assembler is at fault.
>
> My clang can produce working 32-bit "hello world" C and C++ programs.
> It can produce working 64-bit C programs. However, it cannot produce
> a 64-bit "hello world" C++ program. It appears to be trying to place
> exception tables at misaligned addresses. I don't know whether the
> exception-tableness or c++ness is important or just happenstance.
>
> Here is my test program:
>
> #include <iostream>
> #include <string>
> #include <atomic>
> std::atomic<float> y(0.0f);
> int main()
> {
> std::string x("foo\n");
> std::cout << x << y << std::endl;
> return 0;
> }
>
> clang++ -m64 -o /tmp/foo /tmp/foo.cpp -latomic -v
>
> "/usr/ccs/bin/ld" -C -e _start -Bdynamic --dynamic-linker
> /usr/lib/sparcv9/ld.so.1 -o /tmp/foo
> /export/home/dvitek/hermetictc/prest0/bin/../lib64/crt1.o
> /usr/lib/sparcv9/crti.o /usr/lib/sparcv9/values-Xa.o
> /export/home/dvitek/hermetictc/prest0/bin/../lib64/crtbegin.o
> -L/export/home/dvitek/hermetictc/prest0/bin/../lib64
> -L/export/home/dvitek/hermetictc/prest0/bin -L/usr/lib/sparcv9/
> -L/export/home/dvitek/hermetictc/gcc7/lib/sparcv9
> /var/tmp/foo-5242ae.o -latomic -lstdc++ -lgcc_s -lc -lm
> /export/home/dvitek/hermetictc/prest0/bin/../lib64/crtend.o
> /usr/lib/sparcv9/crtn.o
> ld: fatal: relocation error: R_SPARC_DISP32: file
> /var/tmp/foo-5242ae.o: symbol .gcc_except_table (section): offset
> 0xffffffff7c004245 is non-aligned
> ld: fatal: relocation error: R_SPARC_DISP32: file
> /var/tmp/foo-5242ae.o: symbol .gcc_except_table (section): offset
> 0xffffffff7c004261 is non-aligned
> ld: fatal: relocation error: R_SPARC_DISP32: file
> /var/tmp/foo-5242ae.o: symbol .gcc_except_table (section): offset
> 0xffffffff7c004295 is non-aligned
> ld: fatal: relocation error: R_SPARC_DISP32: file
> /var/tmp/foo-5242ae.o: symbol .gcc_except_table (section): offset
> 0xffffffff7c0042dd is non-aligned
> ld: fatal: relocation error: R_SPARC_DISP32: file
> /var/tmp/foo-5242ae.o: symbol .gcc_except_table (section): offset
> 0xffffffff7c004355 is non-aligned
> ld: fatal: relocation error: R_SPARC_DISP32: file
> /var/tmp/foo-5242ae.o: symbol .gcc_except_table (section): offset
> 0xffffffff7c0043a1 is non-aligned
> ld: fatal: relocation error: R_SPARC_DISP32: file
> /var/tmp/foo-5242ae.o: symbol .gcc_except_table (section): offset
> 0xffffffff7c0043d1 is non-aligned
> ld: fatal: relocation error: R_SPARC_DISP32: file
> /var/tmp/foo-5242ae.o: symbol .gcc_except_table (section): offset
> 0xffffffff7c004449 is non-aligned
>
> There are 8 chunks of assembly--one for each link error--that look
> about like this:
>
> .Lfunc_end2:
> .size main, .Lfunc_end2-main
> .cfi_endproc
> .section .gcc_except_table,#alloc
> .p2align 2
> GCC_except_table2:
> .Lexception0:
> .byte 255 ! @LPStart Encoding = omit
> .byte 0 ! @TType Encoding = absptr
> .byte 41 ! @TType base offset
> .byte 3 ! Call site Encoding = udata4
> .byte 39 ! Call site table length
> .word .Ltmp0-.Lfunc_begin0 ! >> Call Site 1 <<
> .word .Ltmp1-.Ltmp0 ! Call between .Ltmp0 and
> .Ltmp1
> .word .Ltmp2-.Lfunc_begin0 ! jumps to .Ltmp2
> .byte 0 ! On action: cleanup
> .word .Ltmp3-.Lfunc_begin0 ! >> Call Site 2 <<
> .word .Ltmp8-.Ltmp3 ! Call between .Ltmp3 and
> .Ltmp8
> .word .Ltmp9-.Lfunc_begin0 ! jumps to .Ltmp9
> .byte 0 ! On action: cleanup
> .word .Ltmp8-.Lfunc_begin0 ! >> Call Site 3 <<
> .word .Lfunc_end2-.Ltmp8 ! Call between .Ltmp8 and
> .Lfunc_end2
> .word 0 ! has no landing pad
> .byte 0 ! On action: cleanup
> .p2align 2
> ! -- End function
>
>
> Some data points:
> - If I compile the object file with g++ (which uses /usr/ccs/bin/as)
> and then link it with clang++ things go smoothly.
> - If I use -fno-exceptions with clang things go smoothly
> - If I don't use -m64 things go smoothly
> - clang is using the integrated assembler
> - clang is using /usr/ccs/bin/ld
> - clang was built using gcc 7.3 and is using gcc's libstdc++
> - Historically, I've always used the sun assembler and linker when
> building gcc toolchains on solaris
> - The sun assembler hates the dialect of assembly being produced by clang
> - clang hates the (sun-style?) assembly that g++ produces
> - lld hates crt1.o, and isn't documented to work on this platform, so
> I'm guessing it is a non-starter
>
> clang was built with -DLLVM_INCLUDE_TOOLS=bootstrap-only,
> -DCLANG_DEFAULT_LINKER=/usr/ccs/bin/ld, various component-disabling
> flags, and some fixes for uninteresting compilation errors.
>
> Has anyone already encountered this problem? Failing that, any
> suggestions for where to get started fixing the issue? Is this worth
> pursuing or is it likely to be the first in a long series of issues?
>
> - Dave
>
> PS
> I sent this message using the wrong account the first time. Apologies
> if anyone receives a duplicate copy.
>
>
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20180420/7fd376bf/attachment.html>
More information about the cfe-dev
mailing list