Budowanie aplikacji 32-bitowej w 64-bitowym systemie Ubuntu

23

Po godzinach googlingu postanawiam się poddać i poprosić ekspertów. Próbuję zbudować 32-bitową aplikację (xgap, jeśli ktoś zainteresowany) na moim 64 Ubuntu 11.10. W pliku makefile dodałem CFLAGS = -m32 i LDFLAGS = -L / usr / lib32 . Obiekty są wbudowane w 32-bitową dokładność. Ostatnim krokiem jest połączenie wszystkich obiektów i bibliotek dla X okien z tym plikiem wykonywalnym --- xgap. Jakoś ciągle pojawia się ten błąd:

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
...

Zainstalowałem obsługę ia32-libs i mutilib . Myślę, że muszę tylko zmusić linker do wygenerowania wyjścia i386. Próbowałem umieścić dwie flagi ld w moim poleceniu gcc, jak pokazano powyżej: -melf_i386 i -oformat elf32-i386 . Ale zdarza się, że gcc nie szuka już 32-bitowej biblioteki w / usr / lib32 . Zastanawiam się, czy muszę uporządkować te flagi w ustalonej kolejności?

Dzięki za pomysł i pomoc!

EDYCJA: kiedy dodam flagę -m32 do mojej ostatniej komendy gcc (uważam, że etap łączenia), nawet jeśli mam flagę -L / usr / lib32, gcc nie szuka już w / usr / lib32 (naprawdę dziwne ...) i generuje następujący błąd:

/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

Czy ktoś ma pojęcie, dlaczego tak się dzieje? Korzystam z narzędzia automatycznego do konfiguracji i wykonania. Jestem naprawdę dobry w modyfikowaniu tych plików skryptów.

EIDT : Rozwiązałem problem. Myślę, że gcc spodziewał się statycznego archiwum biblioteki. Użyłem getlibs skrypt z http://ubuntuforums.org/showthread.php?t=474790 pobrać wszystkie archiwa .a potrzebne do połączenia. Potem gcc działało. Myślę, że gcc przeszukało katalog / usr / lib32, ale nie znalazło archiwów .a, więc przeszukało standardowy katalog, którym jest / usr / lib , w którym znajduje niezgodne pliki * .so .

Ale pytanie brzmi: pliki * .so w / usr / lib32 / z pakietu ia32-libs tak naprawdę nie mają bibliotek potrzebnych do łączenia? Do czego służą te pliki w / usr / lib32 / ?

Bogaty
źródło
powiązane stackoverflow.com/questions/22355436/...
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Odpowiedzi:

15

LDFLAGSpowinien również obejmować -m32. Następujące powinny działać:

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

W rzeczywistości możesz usunąć -L/usr/lib32część, ponieważ jest to domyślny katalog dla bibliotek 32-bitowych, a twój system jest tego świadomy.

Zasadniczo najprostszym sposobem na zbudowanie aplikacji 32-bitowej na komputerze 64-bitowym jest:

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

.. lub podaj te zmienne, aby skonfigurować skrypt, jeśli używasz autotools.

AKTUALIZACJA:

Wygląda na to, że tak naprawdę nie znasz różnic w łączeniu z bibliotekami statycznymi i dynamicznymi. Postaram się być jak najmniej:

  • Zarówno statyczne, jak i dynamiczne biblioteki programistyczne mają to samo rozszerzenie pliku .a
  • Jeśli masz zainstalowane zarówno statyczne, jak i dynamiczne wersje tej samej biblioteki, jedna z nich może mieć dodatkowy postfiks, na przykład libname.adla wersji dynamicznej i libname_s.astatycznej.
  • Pewne, statyczne i dynamiczne wersje bibliotek różnią się rozmiarem. Wersja statyczna jest cięższa.
  • Jeśli łączysz się z biblioteką statyczną - twoja aplikacja nie ma żadnych zależności. Jeśli połączysz się z biblioteką dynamiczną, będzie ona polegać na .sobibliotece wykonawczej, która powinna być obecna w twoim systemie.

Uwaga: nie mówimy tutaj o zaawansowanych sztuczkach, takich jak jawne ładowanie DSO za pomocą API dlopen () / dlsym ().

Andrejs Cainikovs
źródło
Teraz myślę, że coś jest nie tak z moją konfiguracją. Ilekroć dodam -m32 do mojego ostatniego polecenia gcc, przeszukuje on folder / usr / lib. Jeśli nie dodam -m32 i użyję flagi -L / usr / lib32, przeszukuje właściwy katalog, ale wygenerował błędy powyżej. Czy wiesz, co może to powodować?
Bogaty
A co się stanie, jeśli połączysz oba (jak w moim przykładzie powyżej)?
Andrejs Cainikovs,
jeśli połączę oba, nadal nie będzie szukał w / usr / lib32. po prostu szuka w / usr / lib. A przy okazji używam narzędzi automatycznych.
Rich
Dziwne ... Próbowałeś -l/usr/lib32/libXaw.sozamiast tego karmić ?
Andrejs Cainikovs,
Nie można ich znaleźć ....: gcc -o xgap xcmds.o utils.o gapgraph.o gaptext.o pty.o popdial.o xgap.o selfile.o -O2 -L / usr / lib32 -l / usr / lib32 / libXaw.so -l / usr / lib32 / libXmu.so -l / usr / lib32 / libXt.so -l / usr / lib32 / libXext.so -l / usr / lib32 / libX11.so -l / usr / lib32 / libSM.so -l / usr / lib32 / libICE.so -m32 / usr / bin / ld: nie można znaleźć -l / usr / lib32 / libXaw.so
Rich
9

Otrzymywałem błędy, takie jak:

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

Naprawiłem to dla mnie:

sudo apt-get install g++-multilib

jeśli używasz pakietu gcc innego niż domyślny (np. gcc-7), musisz zainstalować pakiet dla tej konkretnej wersji:

sudo apt-get install g++-7-multilib
Vladimir Panteleev
źródło
1
g++-multilibjest dla g ++ (C ++), dla gcc (C) potrzebujesz również gcc-multilib.
pevik