wake-up-neo.net

So kompilieren Sie eine 32-Bit-Binärdatei auf einem 64-Bit-Linux-Computer mit gcc / cmake

Ist es möglich, ein Projekt in 2-Bit mit cmake und gcc auf einem 64-Bit System zu kompilieren? Es ist wahrscheinlich, aber wie mache ich das?

Als ich es auf "unwissende" Weise versuchte, ohne Parameter/Flags/etc zu setzen, setzte ich einfach LD_LIBRARY_PATH, Um die verknüpften Bibliotheken in ~/tools/lib Zu finden. Es scheint, als würde es ignoriert und nur in den genannten Unterverzeichnissen gesucht lib64 .

126
dala
export CFLAGS=-m32
121
caf
 $ gcc test.c -o testc 
 $ file testc 
 testc: ELF-64-Bit-LSB-Programm, x86-64, Version 1 (SYSV), dynamisch verknüpft (verwendet Shared) libs), für GNU/Linux 2.6.9, nicht entfernt 
 $ ldd testc 
 linux-vdso.so.1 => (0x00007fff227ff000) 
 libc.so.6 => /lib64/libc.so.6 (0x000000391f000000) 
 /lib64/ld-linux-x86-64.so.2 (0x000000391ec00000) 
 $ gcc -m32 test.c -o testc 
 $ file testc 
 testc: ELF-32-Bit-LSB-Programm, Intel 80386, Version 1 (SYSV), dynamisch verknüpft (verwendet gemeinsam genutzte Bibliotheken), für GNU/Linux 2.6.9, nicht entfernt 
 $ ldd testc 
 linux-gate.so.1 => (0x009aa000) 
 libc.so.6 => /lib/libc.so.6 (0x00780000) 
 /lib/ld-linux.so.2 (0x0075b000) 

Kurz gesagt: Verwenden Sie die -m32 Flag zum Kompilieren einer 32-Bit-Binärdatei.

Stellen Sie außerdem sicher, dass Sie die 32-Bit-Versionen aller erforderlichen Bibliotheken installiert haben (in meinem Fall war alles, was ich auf Fedora brauchte, glibc-devel.i386).

75
andri

In späteren Versionen von CMake ist eine Möglichkeit, dies auf jedem Ziel zu tun:

set_target_properties(MyTarget PROPERTIES COMPILE_FLAGS "-m32" LINK_FLAGS "-m32")

Ich kenne keine Möglichkeit, dies global zu tun.

15

Für C++ können Sie Folgendes tun:

export CXXFLAGS=-m32

Das funktioniert mit cmake.

7
euccas

Eine Möglichkeit besteht darin, eine Chroot-Umgebung einzurichten. Debian hat eine Reihe von Werkzeugen dafür, zum Beispiel debootstrap

6

Für jede komplexe Anwendung empfehle ich die Verwendung eines lxc container . LXC-Container sind "etwas in der Mitte zwischen einer Chroot auf Steroiden und einer vollwertigen virtuellen Maschine".

So können Sie beispielsweise mit lxc auf einem Ubuntu Trusty-System 32-Bit-Wine erstellen:

Sudo apt-get install lxc lxc-templates
Sudo lxc-create -t ubuntu -n my32bitbox -- --bindhome $LOGNAME -a i386 --release trusty
Sudo lxc-start -n my32bitbox
# login as yourself
Sudo sh -c "sed s/deb/deb-src/ /etc/apt/sources.list >> /etc/apt/sources.list"
Sudo apt-get install devscripts
Sudo apt-get build-dep wine1.7
apt-get source wine1.7
cd wine1.7-*
debuild -eDEB_BUILD_OPTIONS="parallel=8" -i -us -uc -b
shutdown -h now   # to exit the container

Hier ist die Wiki-Seite über wie man mit lxc einen 32-Bit-Wein auf einem 64-Bit-Host erstellt .

6
Sam Watkins