FreeBSD 8.2r amd 64 problem when compiling 32bit applications

Jeremy Chadwick freebsd at jdc.parodius.com
Thu Aug 25 14:07:39 UTC 2011


On Thu, Aug 25, 2011 at 06:28:18AM -0700, noel beck wrote:
> I installed FreeBSD 8.2 release on a 64-bit machine (amd64) and it has gcc
> 4.2.1 built in.  The library directories are lib, lib32 and lib64.  When I
> compiled for 64-bit the compilation was successful. 
> 
> However, the problem is when I am compiling for 32-bit on this 64-bit
> machine.  We are getting an error stating that libstdc++.so.6 is missing. 
> Other forums state that if you install compact6x or compact7x, the missing
> libraries will be installed.  I installed these but it did not solve my
> problem. 
> 
> The following is the example of when compiling in 64-bit:
> [gsaid at Bruno ~]$ ls
> MyDocuments     hello.c
> [gsaid at Bruno ~]$ gcc -o hello hello.c
> [gsaid at Bruno ~]$ ls
> MyDocuments     hello           hello.c
> [gsaid at Bruno ~]$ file hello
> hello: ELF 64-bit LSB executable, x86-64, version 1 (FreeBSD), dynamically
> linked (uses shared libs), for FreeBSD 8.2, not stripped
> [gsaid at Bruno ~]$ ./hello
> Hello, World!
> 
> The following is the example of the error when compiling in 32-bit on a
> 64-bit machine:
> 
> [gsaid at Bruno ~]$ gcc -m32 -o hello hello.c
> /usr/bin/ld: skipping incompatible /usr/lib/libgcc.a when searching for
> -lgcc
> /usr/bin/ld: skipping incompatible /usr/lib/libgcc.a when searching for
> -lgcc
> /usr/bin/ld: cannot find -lgcc
> 
> This is my Hello World script:
> 
> [gsaid at Bruno ~]$ cat hello.c
> #include <stdio.h>
> 
> int main(int argc, char **argv)
> {
>     printf("Hello, World!\n");
>     return 0;
> }
> 
> I have also tried adding "WITH_LIB32=yes" to /etc/make.conf and compiled and
> installed the kernel again.
> 
> When I locate for libgcc.a to see if there is a one for 32-bit, only one is
> found and it is of 64-bit
> 
> [gsaid at Bruno /]$ locate libgcc.a
> /usr/lib/libgcc.a
> [gsaid at Bruno /]$ nm /usr/lib/libgcc.a
> 
> __gcc_bcmp.o:
> 0000000000000000 T __gcc_bcmp

Please see this thread from March:

http://lists.freebsd.org/pipermail/freebsd-stable/2011-March/thread.html#61846

Though I believe you already have.  Why do I say that?  Because you
started a thread a couple days ago which was actually a *reply* to the
aforementioned thread in March (and all you did was change the Subject
line).  Here's how I know that:

1186     03/09 15:15  Thomas David Rivers (1.0K) bin/139146 still not right in FreeBSD 8.2 (-m32 on amd64)?
1187     03/09 12:52  Josh Carroll        (0.8K) |->
1188     03/09 22:44  Matthias Andree     (1.0K) | `->
1189     03/09 14:55  Mark Linimon        (0.5K) |->
1190     03/09 16:08  Thomas David Rivers (0.4K) | `->
1191     03/15 00:16  Dimitry Andric      (1.1K) |->
1192     08/23 00:26  noel beck           (0.7K) `->-m32 on freeBSD 8.2r amd64
1193     08/23 14:46  Edho Arief          (0.6K)   `->
1194     08/24 13:11  Michael Hoffmann    (1.4K)     `->
1195     08/24 13:57  Tom Evans           (1.1K)       `->
1196  s  08/24 16:01  Kostik Belousov     (1.6K)         `->

Your mail on 08/23 has these lines in it, which act as validation that
you replied to an earlier thread (from March) and tried to start your
own:

>> In-Reply-To: <201103092015.p29KFd0U077849 at dave.dignus.com>
>> References: <201103092015.p29KFd0U077849 at dave.dignus.com>

Anyway, did you read any of the replies from Edho, Michael, Tom, and
Kostik?  They all provide insights and answers to your question.

Next: there is no WITH_LIB32.  There is only WITHOUT_LIB32.
Furthermore, that setting goes in /etc/src.conf not /etc/make.conf.  Yes
there is a difference (you need to familiarise yourself with 8.x and
later; take the time.  :-) ).  man src.conf.

Next, yet related: even if there was a WITH_LIB32, rebuilding the
**kernel** would not solve anything.  You would need to build world.
But again, there is no WITH_LIB32.  If you build world on amd64 it will,
by default, attempt to build 32-bit versions of libraries so that you
can compile i386 binaries on amd64.

The kernel shims for 32-bit support on amd64 is a kernel option in your
kernel config called COMPAT_FREEBSD32.  This would allow the kernel to
support 32-bit applications; it doesn't have anything to do with
userland libraries (32-bit libc, etc.).

-- 
| Jeremy Chadwick                                jdc at parodius.com |
| Parodius Networking                       http://www.parodius.com/ |
| UNIX Systems Administrator                   Mountain View, CA, US |
| Making life hard for others since 1977.               PGP 4BD6C0CB |



More information about the freebsd-stable mailing list