Compile libgcc.a and libstd++.a for 32 bits - gcc

Good afternoon,
If I'm here today is because I encounter some compilation problems.
For a project, I would like to compile gcc in order to have libgcc.a and libstd++.a for 32 bits.
Unfortunatly I have some problems.
Here are the command lines I used to configure and compile the wanted libraries:
CC="gcc -m32" CXX="g++ -m32" CFLAGS="-O1 -march=i686 -gtoggle" CXXFLAGS="-O1 -march=i686 -gtoggle" ; ../src/gcc/gcc-8.1.0/configure --prefix=/path/compiled/x86/O1/gcc --enable-languages=c,c++ --enable-static i686-linux-gnu
make all-gcc
make install-target-libgcc
When I execute last command line I have those errors:
/usr/bin/ld: skipping incompatible /usr/lib/libc.so when searching for -lc
/usr/bin/ld: skipping incompatible /usr/lib/libc.a when searching for -lc
/usr/bin/ld: cannot find -lc
collect2: error: ld returned 1 exit status
make[1]: *** [Makefile:985: libgcc_s.so] Error 1
My machine:
Archlinux 64 bits, up to date
Output of gcc -v:
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-pc-linux-gnu/8.1.0/lto-wrapper
Target: x86_64-pc-linux-gnu
Configured with: /build/gcc/src/gcc/configure --prefix=/usr --libdir=/usr/lib --libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=https://bugs.archlinux.org/ --enable-languages=c,c++,ada,fortran,go,lto,objc,obj-c++ --enable-shared --enable-threads=posix --enable-libmpx --with-system-zlib --with-isl --enable-__cxa_atexit --disable-libunwind-exceptions --enable-clocale=gnu --disable-libstdcxx-pch --disable-libssp --enable-gnu-unique-object --enable-linker-build-id --enable-lto --enable-plugin --enable-install-libiberty --with-linker-hash-style=gnu --enable-gnu-indirect-function --enable-multilib --disable-werror --enable-checking=release --enable-default-pie --enable-default-ssp
Thread model: posix
gcc version 8.1.0 (GCC)
Thank you for your help !
EDIT: ANSWER HERE
SO for those who wants to know how to compile libgcc and libstdc++ for 32 on a x86_64 machine:
./configure --target=$TARGET --disable-nls --enable-languages=c,c++ --without-headers --prefix=/path/
make all-gcc
make all-target-libgcc
make all-target-libstdc++-v3
make install-gcc
make install-target-libgcc
make install-target-libstdc++-v3
make clean
Then go to the folder containing your new installation, you'll normaly have two folders: lib32 and lib64. Inside lib32, there is the 32 bits version of libgcc and libstdc++ and in lib64, their 64 bits version.
Enjoy !

Related

MingW doesn't generate object file; what am I doing wrong?

I just installed mingw64 in my msys2 env on Win11. The compiler does not produce an object file when compiling a trivial file:
foo.c:
int i;
% /mingw64/bin/gcc -v -c foo.c
Using built-in specs.
COLLECT_GCC=C:\msys64\mingw64\bin\gcc.exe
Target: x86_64-w64-mingw32
Configured with: ../gcc-12.2.0/configure --prefix=/mingw64 --with-local-prefix=/mingw64/local --build=x86_64-w64-mingw32 --host=x86_64-w64-mingw32 --target=x86_64-w64-mingw32 --with-native-system-header-dir=/mingw64/include --libexecdir=/mingw64/lib --enable-bootstrap --enable-checking=release --with-arch=nocona --with-tune=generic --enable-languages=c,lto,c++,fortran,ada,objc,obj-c++,jit --enable-shared --enable-static --enable-libatomic --enable-threads=posix --enable-graphite --enable-fully-dynamic-string --enable-libstdcxx-filesystem-ts --enable-libstdcxx-time --disable-libstdcxx-pch --enable-lto --enable-libgomp --disable-multilib --disable-rpath --disable-win32-registry --disable-nls --disable-werror --disable-symvers --with-libiconv --with-system-zlib --with-gmp=/mingw64 --with-mpfr=/mingw64 --with-mpc=/mingw64 --with-isl=/mingw64 --with-pkgversion='Rev10, Built by MSYS2 project' --with-bugurl=https://github.com/msys2/MINGW-packages/issues --with-gnu-as --with-gnu-ld --disable-libstdcxx-debug --with-boot-ldflags=-static-libstdc++ --with-stage1-ldflags=-static-libstdc++
Thread model: posix
Supported LTO compression algorithms: zlib zstd
gcc version 12.2.0 (Rev10, Built by MSYS2 project)
COLLECT_GCC_OPTIONS='-v' '-c' '-mtune=generic' '-march=nocona'
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/12.2.0/cc1.exe -quiet -v -iprefix C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/12.2.0/ -D_REENTRANT foo.c -quiet -dumpbase foo.c -dumpbase-ext .c -mtune=generic -march=nocona -version -o C:\Users\me\AppData\Local\Temp\ccF8KQyo.s
% ls -l
-a--- 7 3 Feb 15:57 foo.c
%
As you can see it just outputs an assembly file into %TMP%. No errors or warnings (compiling without -v produces nothing on stdout/stderr).
I must have something misconfigured, but not sure what. I have reviewed previous SO answers but they are about source code with errors or warnings.
Turns out you need to have /mingw64/bin in $PATH or it fails silently in this way. Solved.

warnings while trying to compile old linux kernel with gcc 12.1.0

I am currently hunting a bug using git bisect in linux staging-testing tree.
Some commits are giving following errors after I try to build them:
subcmd-util.h:58:31: error: pointer may be used after ‘realloc’ [-Werror=use-after-free]
58 | ret = realloc(ptr, 1);
check.c:2867:58: error: ‘%d’ directive output may be truncated writing between 1 and 10 bytes into a region of size 9 [-Werror=format-truncation=]
2867 | snprintf(pvname, sizeof(pvname), "pv_ops[%d]", idx);
I tried adding -Wno-error=use-after-free to KBUILD_FLAGS in main Makefile, tried adding
KBUILD_CFLAGS += $(call cc-disable-warning, use-after-free)
I even tried removing -Werror from CFLAGS in Makefile in folder where problematic files are located, but nothing worked.
More information:
$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-pc-linux-gnu/12.1.0/lto-wrapper
Target: x86_64-pc-linux-gnu
Configured with: /build/gcc/src/gcc/configure --enable-languages=c,c++,ada,fortran,go,lto,objc,obj-c++ --enable-bootstrap --prefix=/usr --libdir=/usr/lib --libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=https://bugs.artixlinux.org/ --with-linker-hash-style=gnu --with-system-zlib --enable-__cxa_atexit --enable-cet=auto --enable-checking=release --enable-clocale=gnu --enable-default-pie --enable-default-ssp --enable-gnu-indirect-function --enable-gnu-unique-object --enable-linker-build-id --enable-lto --enable-multilib --enable-plugin --enable-shared --enable-threads=posix --disable-libssp --disable-libstdcxx-pch --disable-werror --with-build-config=bootstrap-lto --enable-link-serialization=1
Thread model: posix
Supported LTO compression algorithms: zlib zstd
gcc version 12.1.0 (GCC)
Linux staging tree: git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging.git.
One of the commits that gives following warnings: 2ab9c9675fe892e7fe9fa8c0a6125e2b40d2889d.
To compile older version of kernel I needed older compiler ("Linux kernel sources are in general not forward-compatible with new compilers"). In my case the kernel version was 5.16.0 and I could compile it with gcc 11. If you have gcc 11 specific warnings then try gcc 10 and so on.
Except CC flags, I also needed set to HOSTCC flags to use gcc-11 compiler:
make HOSTCC=gcc-11 CC=gcc-11

how to fix: /bin/ld: cannot find -lgfortran error: ld returned 1 exit status

I am trying to compile a Fortran code (package) with gfortran in a Linux server, on which I have no root access.
It has a Makefile and when I run make I get this error
/bin/ld: cannot find -lgfortran
collect2: error: ld returned 1 exit status
but gcc is already installed on cluster.
gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/lto-wrapper
Target: x86_64-redhat-linux
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-linker-hash-style=gnu --enable-languages=c,c++,objc,obj-c++,java,fortran,ada,go,lto --enable-plugin --enable-initfini-array --disable-libgcj --with-isl=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/isl-install --with-cloog=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/cloog-install --enable-gnu-indirect-function --with-tune=generic --with-arch_32=x86-64 --build=x86_64-redhat-linux
Thread model: posix
gcc version 4.8.5 20150623 (Red Hat 4.8.5-16) (GCC)
or libgfortran:
locate libgfortran
/usr/lib/libgfortran.so.3.0.0
/usr/lib/gcc/x86_64-redhat-linux/4.8.2/libgfortran.so
/usr/lib/gcc/x86_64-redhat-linux/4.8.2/libgfortran.spec
/usr/lib/gcc/x86_64-redhat-linux/4.8.2/libgfortranbegin.a
/usr/lib/gcc/x86_64-redhat-linux/4.8.2/32/libgfortran.a
/usr/lib/gcc/x86_64-redhat-linux/4.8.2/32/libgfortran.so
/usr/lib/gcc/x86_64-redhat-linux/4.8.2/32/libgfortranbegin.a
/usr/lib64/libgfortran.so.1
/usr/lib64/libgfortran.so.1.0.0
/usr/lib64/libgfortran.so.3
/usr/lib64/libgfortran.so.3.0.0
/usr/share/doc/gcc-gfortran-4.8.5/ChangeLog-2002.libgfortran.bz2
/usr/share/doc/gcc-gfortran-4.8.5/ChangeLog-2003.libgfortran.bz2
/usr/share/doc/gcc-gfortran-4.8.5/ChangeLog-2004.libgfortran.bz2
/usr/share/doc/gcc-gfortran-4.8.5/ChangeLog-2005.libgfortran.bz2
/usr/share/doc/gcc-gfortran-4.8.5/ChangeLog-2006.libgfortran.bz2
/usr/share/doc/gcc-gfortran-4.8.5/ChangeLog-2007.libgfortran.bz2
/usr/share/doc/gcc-gfortran-4.8.5/ChangeLog-2008.libgfortran.bz2
/usr/share/doc/gcc-gfortran-4.8.5/ChangeLog-2009.libgfortran.bz2
/usr/share/doc/gcc-gfortran-4.8.5/ChangeLog-2010.libgfortran.bz2
/usr/share/doc/gcc-gfortran-4.8.5/ChangeLog-2011.libgfortran.bz2
/usr/share/doc/gcc-gfortran-4.8.5/ChangeLog-2012.libgfortran.bz2
/usr/share/doc/gcc-gfortran-4.8.5/ChangeLog.libgfortran.bz2
and this is the output of installed package
yum list gcc-gfortran
Failed to set locale, defaulting to C
Loaded plugins: langpacks, product-id, search-disabled-repos, subscription-manager
Repodata is over 2 weeks old. Install yum-cron? Or run: yum makecache fast
Installed Packages
gcc-gfortran.x86_64 4.8.5-16.el7 #local-rhels7.4-x86_64--install-rhels7.4-x86_64
The question is why it can not find libgfortran, while gcc is installed?
I have also tried to update $PATH but it did not change anything.
I am just a user of the server without root access.

Compiler lacks asm-goto support on Fedora 28

I couldn't find an rpm for v4l2loopback so I tried to compile it on a fresh Fedora 28, but it failed :
$ LANG=en_US.utf8 make
Building v4l2-loopback driver...
make -C /lib/modules/`uname -r`/build M=/opt/v4l2loopback modules
make[1]: Entering directory '/usr/src/kernels/4.17.6-200.fc28.x86_64'
arch/x86/Makefile:184: *** Compiler lacks asm-goto support.. Stop.
make[1]: Leaving directory '/usr/src/kernels/4.17.6-200.fc28.x86_64'
make: *** [Makefile:43: v4l2loopback.ko] Error 2
I found that asm-goto has been supported since gcc 4.5, and I have 8.1.1 installed :
$ LANG=en_US.utf8 gcc -v
Using built-in specs.
COLLECT_GCC=cc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/8/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none
OFFLOAD_TARGET_DEFAULT=1
Target: x86_64-redhat-linux
Configured with: ../configure --enable-bootstrap --enable- languages=c,c++,fortran,objc,obj-c++,ada,go,lto --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-shared --enable-threads=posix --enable-checking=release --enable-multilib --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-gcc-major-version-only --with-linker-hash-style=gnu --enable-plugin --enable-initfini-array --with-isl --enable-libmpx --enable-offload-targets=nvptx-none --without-cuda-driver --enable-gnu-indirect-function --enable-cet --with-tune=generic --with-arch_32=i686 --build=x86_64-redhat-linux
Thread model: posix
gcc version 8.1.1 20180712 (Red Hat 8.1.1-5) (GCC)
I managed to compile the module by simply commenting the following check in /usr/src/kernels/4.17.6-200.fc28.x86_64/arch/x86/Makefile :
# ifndef CC_HAVE_ASM_GOTO
# $(error Compiler lacks asm-goto support.)
# endif
but obviously this is a dirty workaround. Yet, the Makefile CFLAGS actually had -DCC_HAVE_ASM_GOTO set. I also tried to set CC_HAV_ASM_GOTO in the Makefile but it didn't help.
What's wrong here ? Is it the Makefile, or Fedora, or am I missing something ? I lost familiarity with Makefiles…
I got the same problem. The caches of Makefile were staled/dirty.
In my case, it seems because I terminated make on the fly.
Inspired from this old patch https://lkml.org/lkml/2018/3/19/1474, I changed from the shell-cached to shell in Makefile in base dir to avoid caching and it works:
-ifeq ($(call shell-cached,$(CONFIG_SHELL) $(srctree)/scripts/gcc-goto.sh $(CC) $(KBUILD_CFLAGS)), y)
+ifeq ($(shell $(CONFIG_SHELL) $(srctree)/scripts/gcc-goto.sh $(CC) $(KBUILD_CFLAGS)), y)
Then clean to make sure we don't have bad cache:
make clean
make -j9

How to add '-march=' as default option to gcc?

I can not compile a simple c program without specifying '-march=native', I need to run it as: 'gcc -march=native -o hello hello.c'.
I did:
export CFLAGS='-march=native'
export CXXFLAGS='-march=native'
but didn't help.
user#server:~$ gcc -march=native -Q --help=target
...
-march=corei7-avx
...
Output of gcc -v:
user#server:~$ gcc -v
Using built-in specs.
gcc: error: missing argument to ‘-march=’
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.7/lto-wrapper
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Debian 4.7.2-5' --with-bugurl=file:///usr/share/doc/gcc-4.7/README.Bugs --enable-languages=c,c++,go,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.7 --enable-shared --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.7 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --enable-plugin --enable-objc-gc --with-arch-32=i586 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 4.7.2 (Debian 4.7.2-5)
Where and how can I add this option to be default?
Two options:
Hard way. You may dump your specs file with gcc -dumpspecs > specs
command. Now put this file to /usr/lib/gcc/x86_64-linux-gnu/4.7/
folder and edit it to add option as described in documentation.
In your case I suggest to start from removing all
march=<something> lines, this might trivially help. But general case is troubles and creativity at this point.
Easy way: rename gcc binary to, say gcc-4.7 and make alias with
alias gcc='gcc-4.7 -march=native'

Resources