64 bit Ubuntu'da 32 bit uygulama oluşturma

20

Saatlerce çalıştıktan sonra, pes etmeye ve uzmanlara sormaya karar verdim. Benim 64 Ubuntu 11.10 benim 32-bit bir uygulama (ilgilenen varsa xgap) oluşturmaya çalışıyorum. Makefile'de CFLAGS = -m32 ve LDFLAGS = -L / usr / lib32 ekledim. Nesneler 32 bit ince yapılı. Son adım, X pencereleri için tüm nesneleri ve kitaplıkları bu yürütülebilir --- xgap içine bağlamaktır. Her nasılsa bana bu hatayı veriyor:

gcc -o xgap xcmds.o utils.o gapgraph.o gaptext.o pty.o popdial.o xgap.o selfile.o   -L/usr/lib32 -lXaw -lXmu -lXt -lXext -lX11  -lSM -lICE

/usr/bin/ld: skipping incompatible /usr/lib32/libXmu.so when searching for -lXmu
...

/usr/bin/ld: i386 architecture of input file 'xcmds.o' is incompatible with i386:x86-64 output
...

ia32-libs ve mutilib desteği 'yi yükledim. Sanırım bağlayıcıyı bir i386 çıktısı üretmek için zorlamak zorundayım. Yukarıda gösterildiği gibi gcc komutuma iki tane ld bayrağı koymaya çalıştım: -melf_i386 ve -oformat elf32-i386 . Ama ne olur, gcc artık / usr / lib32 içinde 32 bit kitaplığı aramaz. Bu bayrakları belirli bir sıraya koymam gerekip gerekmediğini merak ediyorum.

Herhangi bir fikir ve yardım için teşekkürler!

DÜZENLEME: son gcc komutumda (inandığım bağlantı aşamasına) -m32 bayrağını eklediğimde, -L / usr / lib32 bayrağı yerinde olsa bile, gcc / usr / lib32 içinde arama yapmıyor artık (gerçekten garip ...) ve aşağıdaki hatayı üretir:

/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.6.1/../../../libXaw.so when searching for -lXaw
/usr/bin/ld: skipping incompatible /usr/lib/libXaw.so when searching for -lXaw
/usr/bin/ld: cannot find -lXaw
collect2: ld returned 1 exit status

Bunun neden olduğu hakkında bir fikri olan var mı? Yapılandırmak ve yapmak için otomatik aracı kullanıyorum. Bu betik dosyalarını değiştirmekte gerçekten iyiyim.

EIDT : Sorunu çözdüm. Bence gcc bir statik kütüphane arşivi bekliyordu. Bağlantı için gereken tüm .a arşivlerini indirmek için İşte adresinden getlibs komut dosyasını kullandım. . Sonra gcc çalıştı. / usr / lib32 dizininde gcc araması yaptım, ancak .a arşivlerini bulamadık. Bu nedenle standart dizinde arama yaptık / usr / lib olan *. dosyalarının uyumsuz olduğu yer.

Ancak, soru şu: ia32-libs paketindeki / usr / lib32 / içindeki * .s dosyaları gerçekten değil bağlanması için kütüphanelere ihtiyaç var mı? / usr / lib32 / dosyasında kullanılan dosyalar nedir?

    
sordu Rich 07.12.2011 20:53

2 cevap

13

LDFLAGS , -m32 değerini de içermelidir. Aşağıdakiler çalışmalıdır:

export LDFLAGS='-m32 -L/usr/lib32'

Aslında, -L/usr/lib32 bölümünü düşürebilirsiniz, çünkü bu 32bit libs için varsayılan bir dizin ve sisteminiz bunun farkında.

Temel olarak, 64 bit makinede 32 bit uygulama oluşturmanın en basit yolu şudur:

export CFLAGS='-m32'
export CXXFLAGS='-m32'
export LDFLAGS='-m32'
make

.. veya Bu değişkenleri komut dosyasını yapılandırmak için besleyin autotools kullanıyorsanız.

GÜNCELLEME:

Statik ve dinamik kütüphanelerle bağlantıdaki farklılıkları gerçekten bilmediğiniz gibi görünüyor. Mümkün olduğunca minimal olmaya çalışacağım:

  • Statik ve dinamik geliştirme kitaplıklarının ikisi de aynı dosya uzantısına sahiptir .a
  • Aynı kitaplığın hem statik hem de dinamik sürümlerini yüklediyseniz, bunlardan biri, dinamik için libname.a ve statik sürüm için libname_s.a gibi ek bir posta koduna sahip olabilir.
  • Elbette, statik ve dinamik kütüphane sürümleri farklıdır. Statik sürüm daha ağırdır.
  • Statik kütüphaneyle bağlantı kurarsanız - uygulamanızın bağımlılığı yoktur. Dinamik kitaplığa bağlanırsanız, sisteminizde bulunması gereken .so çalışma zamanı kitaplığına güvenir.

Lütfen dikkat edin, burada DSO'ların dlopen () / dlsym () API'sini kullanarak açıkça yüklenmesi gibi gelişmiş hilelerden söz etmiyoruz.

    
verilen cevap Andrejs Cainikovs 07.12.2011 20:59
6

Böyle hatalar alıyordum:

/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.8/libstdc++.so when searching for -lstdc++

Bu benim için düzeltildi:

sudo apt-get install g++-multilib

Varsayılan olandan farklı bir gcc paketi kullanıyorsanız (ör. gcc-7 ), söz konusu paketi söz konusu sürüm için yüklemeniz gerekir:

sudo apt-get install g++-7-multilib
    
verilen cevap Vladimir Panteleev 28.06.2014 14:33

Etiketlerdeki diğer soruları oku