[Clfs-support] Help My x86_64 uClibc gcc is outputting 32 bit code
Chris Ziomkowski
cziom at jsg.co.th
Mon Oct 13 08:54:27 PDT 2008
Hello everyone.
I am hoping someone here can point me in the right direction. I have
previously started with the LiveCD and built an x86_64 CLFS system with
glibc which is very stable now and has run without incident for several
weeks. This is now my host system.
I am now trying to build a target x86_64 pure 64 bit system using uClibc
and including the latest GNU 4.3.2 gcc compiler. This project is going
to run on an Atom based system, and even the current gcc has not yet
been optimized for this CPU. Even so, I need the latest compiler so that
I'm prepared when the enhancements do eventually show up.
There are many examples on the net of building uClibc. There are also
many at building x86_64 for glibc. There is basically no support for
building pure 64 x86_64 and uClibc, especially when using the 4.3.2
version of gcc.
After 3 weeks of fighting problems with uClibc (has some issues with
x86_64), and gcc for uClibc, I thought I finally had a good compiler. It
passed all the tests...or as many as you can expect with uClibc. I built
all my native applications and they ran. I was busy congratulating
myself when I tried to rebuild uClibc using the native compiler on the
uClibc system. That is when I ran into problems. uClibc compiles fine,
but as soon as I install the libraries I get a segmentation fault
running any program.
I tracked the problem down to the function isatty() inside of uClibc.
When I compile uClibc with my cross-compiler from the host system I get
the following (correct) code snippet:
__GI_isatty:
.LFB2:
subq $88, %rsp
.LCFI0:
movq %rsp, %rsi
movq __stack_chk_guard(%rip), %rax
movq %rax, 72(%rsp)
xorl %eax, %eax
call __GI_tcgetattr
testl %eax, %eax
sete %al
movq 72(%rsp), %rdx
...
However, when I compile using my native compiler, I get the following
(incorrect) code:
__GI_isatty:
.LFB2:
subq $88, %rsp
.LCFI0:
movq %rsp, %rsi
movq %fs:40, %rax <=== Segmentation fault occurs here
movq %rax, 72(%rsp)
xorl %eax, %eax
call __GI_tcgetattr
testl %eax, %eax
sete %al
movq 72(%rsp), %rdx
...
When the code tries to access fs, it seg faults. (fs is currently 0 ). I
have seen many other instances of the compiler generating 32 bit
compatible code (e.g. movq __locale_mmap at GOTPCREL(%rip), %rax) since I
have started looking for it, but this is the instruction that causes my
immediate problems.
So, I'm guessing I missed a patch somewhere which tells GCC to be
completely 64 bit, or else the uClibc patches overwrote it. This isn't
surprising as there were dozens of patches I tried and many of the
uClibc patches were incompatible with the pure 64 bit patches
recommended by the CLFS project.
Rather than simply specifying yet another patch, can someone help me
understand the principles involved in making GCC generate pure 64 bit
code? Then, at least if the patch doesn't work, I can try to figure out
where it went wrong. For reference, the following patches were applied,
which worked after some massaging:
gcc-4.3.2-pure64-1.patch
200-uclibc-locale.patch
203-uclibc-locale-no__x.patch
204-uclibc-locale-wchar_fix.patch
205-uclibc-locale-update.patch
301-missing-execinfo_h.patch
303-c99-complex-ugly-hack.patch
304-index_macro.patch
305-libmudflap-susv3-legacy.patch
306-libstdc++-namespace.patch
So, is there anyone who can explain to me what needs to be fixed for gcc
to generate real 64 bit code, and how I should go about doing that?
Thank you for any assistance,
Chris
More information about the Clfs-support
mailing list