[x86_64] Compilen van 32bit binary

Pagina: 1
Acties:

  • Darkvater
  • Registratie: Januari 2001
  • Laatst online: 26-08-2024

Darkvater

oh really?

Topicstarter
Hier zit ik dus mee, het lukt gewoon niet.
Heel simpele programmaatje:
code:
1
2
3
int main() {
  return 0;
}


Als ik het compileer met g++ dan werkt het niet, en het maakt hem helemaal niks uit wat ik als -L aan libraries aan toevoeg:
code:
1
2
3
4
5
darkvater@arrakis:/tmp/> g++ -m32 test.cc -L/usr/lib -o test
/usr/lib64/gcc/x86_64-suse-linux/4.2.1/../../../../x86_64-suse-linux/bin/ld: skipping incompatible /usr/lib64/gcc/x86_64-suse-linux/4.2.1/libstdc++.so when searching for -lstdc++
/usr/lib64/gcc/x86_64-suse-linux/4.2.1/../../../../x86_64-suse-linux/bin/ld: skipping incompatible /usr/lib64/gcc/x86_64-suse-linux/4.2.1/libstdc++.a when searching for -lstdc++
/usr/lib64/gcc/x86_64-suse-linux/4.2.1/../../../../x86_64-suse-linux/bin/ld: cannot find -lstdc++
collect2: ld returned 1 exit status


Maar met gcc doet ie het wel, zelfs zonder -L :? :
code:
1
2
3
Darkvater@arrakis:/tmp/> gcc -m32 test.cc -L/usr/lib -o test
Darkvater@arrakis:/tmp/> file test
test: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.4, dynamically linked (uses shared libs), not stripped


Alhoewel al een wat meer ingewikkeld programma het ook niet doet:
code:
1
2
3
4
5
6
#include <stdio.h>

int main() {
  printf("Hello World!\n");
  return 0;
}

code:
1
2
3
4
5
Darkvater@arrakis:/tmp/> gcc -m32 test.cc -L/usr/lib -lstdc++ -o test
/usr/lib64/gcc/x86_64-suse-linux/4.2.1/../../../../x86_64-suse-linux/bin/ld: skipping incompatible /usr/lib64/gcc/x86_64-suse-linux/4.2.1/libstdc++.so when searching for -lstdc++
/usr/lib64/gcc/x86_64-suse-linux/4.2.1/../../../../x86_64-suse-linux/bin/ld: skipping incompatible /usr/lib64/gcc/x86_64-suse-linux/4.2.1/libstdc++.a when searching for -lstdc++
/usr/lib64/gcc/x86_64-suse-linux/4.2.1/../../../../x86_64-suse-linux/bin/ld: cannot find -lstdc++
collect2: ld returned 1 exit status


Wat doe ik nou fout, en wat moet ik misschien installeren?
Ik heb een /usr/lib directory met daar alle benodigde files.

[ Voor 24% gewijzigd door Darkvater op 09-11-2007 01:10 ]


Windows Vista? *NEVER* Het waarom - Opera forever!!!
I've seen chickens that were more menacing. Chickens in a coma. On ice. In my fridge


  • _JGC_
  • Registratie: Juli 2000
  • Laatst online: 08:24
Allereerst: het heeft geen zin om met g++ te compilen als je een C programma maakt. Verder hoef je in dat geval ook geen -lstdc++ op te geven, want je hoeft niet aan de C++ libs te linken.

Voor de rest van je probleem: om 32bits software te kunnen crosscompilen met -m32 moet je ook 32bit versies van de gebruikte libs op je systeem hebben. Je kunt geen 32bit software linken met 64bit libs.

  • Darkvater
  • Registratie: Januari 2001
  • Laatst online: 26-08-2024

Darkvater

oh really?

Topicstarter
_JGC_ schreef op vrijdag 09 november 2007 @ 08:18:
Allereerst: het heeft geen zin om met g++ te compilen als je een C programma maakt. Verder hoef je in dat geval ook geen -lstdc++ op te geven, want je hoeft niet aan de C++ libs te linken.

Voor de rest van je probleem: om 32bits software te kunnen crosscompilen met -m32 moet je ook 32bit versies van de gebruikte libs op je systeem hebben. Je kunt geen 32bit software linken met 64bit libs.
Ja, dat snap ik, het was alleen ter voorbeeld. Ook de 32bits linken met 64bits snap ik, maar wat me nou niet lukt is om dat te forceren, of hoe dat te doen. Zoals hierboven gezegd heb ik de 32bits libraries in /usr/lib (en/of in /lib) staan, dus dat zou geen probleem moeten zijn. Maar gcc wil het gewoon niet pakken!

code:
1
2
3
4
5
6
7
8
9
10
./usr/lib/libstdc++.so.5
./usr/lib/libstdc++.so.6.0.9
./usr/lib/libstdc++.so.5.0.7
./usr/lib/libstdc++.so.6
./usr/lib64/gcc/x86_64-suse-linux/4.2.1/libstdc++.a
./usr/lib64/gcc/x86_64-suse-linux/4.2.1/libstdc++.so
./usr/lib64/libstdc++.so.5
./usr/lib64/libstdc++.so.6.0.9
./usr/lib64/libstdc++.so.5.0.7
./usr/lib64/libstdc++.so.6

[ Voor 17% gewijzigd door Darkvater op 09-11-2007 11:23 ]


Windows Vista? *NEVER* Het waarom - Opera forever!!!
I've seen chickens that were more menacing. Chickens in a coma. On ice. In my fridge


  • Vaan Banaan
  • Registratie: Februari 2001
  • Niet online

Vaan Banaan

Heeft ook Apache ontdekt

Wat _JGC_ volgens mij bedoelt, is dat je in je laatste voorbeeld met gcc de -lstdc++ weg kan laten.

500 "The server made a boo boo"


  • Darkvater
  • Registratie: Januari 2001
  • Laatst online: 26-08-2024

Darkvater

oh really?

Topicstarter
Vaan Banaan schreef op vrijdag 09 november 2007 @ 13:10:
Wat _JGC_ volgens mij bedoelt, is dat je in je laatste voorbeeld met gcc de -lstdc++ weg kan laten.
Als ik dat weglaat, kan gcc de source code niet linken, en zeurt over _gxx_personality ofzo.
Maar deze hele discussie is irrelevant. Het probleem is hoe ik tegen GCC zeg dat ie de libraries in /lib en /usr/lib gebruikt, want wat het zou moeten zijn (-L/lib -L/usr/lib) werkt niet!


Windows Vista? *NEVER* Het waarom - Opera forever!!!
I've seen chickens that were more menacing. Chickens in a coma. On ice. In my fridge


  • Xiphalon
  • Registratie: Juni 2001
  • Laatst online: 30-01 17:11
en als je de libraries direct meegeeft in de commandline? Dus ipv -lstdc++ /usr/lib/libstdc++.6.0.0.a ?

En anders moet je mischien je specs file aanpassen, geef eens een gcc -dumpspecs

  • Darkvater
  • Registratie: Januari 2001
  • Laatst online: 26-08-2024

Darkvater

oh really?

Topicstarter
darkmage schreef op zaterdag 10 november 2007 @ 14:43:
en als je de libraries direct meegeeft in de commandline? Dus ipv -lstdc++ /usr/lib/libstdc++.6.0.0.a ?

En anders moet je mischien je specs file aanpassen, geef eens een gcc -dumpspecs
code:
1
2
3
Darkvater@arrakis:/tmp> gcc -m32 test.cc -l/usr/lib/libstdc++.so.6.0.9
/usr/lib64/gcc/x86_64-suse-linux/4.2.1/../../../../x86_64-suse-linux/bin/ld: cannot find -l/usr/lib/libstdc++.so.6.0.9
collect2: ld returned 1 exit status


Het meerendeeel van onderstaande zegt me niet zo veel, maar zie wel dat er bij m32 ../lib wordt gebruikt ipv ../lib64, dus het lijkt me goed?

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
*asm:
%{v:-V} %{Qy:} %{!Qn:-Qy} %{n} %{T} %{Ym,*} %{Yd,*}  %{Wa,*:%*} %{m32:--32} %{m64:--64}

*asm_debug:
%{gstabs*:--gstabs}%{!gstabs*:%{g*:--gdwarf2}}

*asm_final:


*asm_options:
%a %Y %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O}

*invoke_as:
%{!S:-o %|.s |
 as %(asm_options) %|.s %A }

*cpp:
%{posix:-D_POSIX_SOURCE} %{pthread:-D_REENTRANT}

*cpp_options:
%(cpp_unique_options) %1 %{m*} %{std*&ansi&trigraphs} %{W*&pedantic*} %{w} %{f*} %{g*:%{!g0:%{!fno-working-directory:-fworking-directory}}} %{O*} %{undef} %{save-temps:-fpch-preprocess}

*cpp_debug_options:
%{d*}

*cpp_unique_options:
%{C|CC:%{!E:%eGCC does not support -C or -CC without -E}} %{!Q:-quiet} %{nostdinc*} %{C} %{CC} %{v} %{I*&F*} %{P} %I %{MD:-MD %{!o:%b.d}%{o*:%.d%*}} %{MMD:-MMD %{!o:%b.d}%{o*:%.d%*}} %{M} %{MM} %{MF*} %{MG} %{MP} %{MQ*} %{MT*} %{!E:%{!M:%{!MM:%{MD|MMD:%{o*:-MQ %*}}}}} %{remap} %{g3:-dD} %{H} %C %{D*&U*&A*} %{i*} %Z %i %{fmudflap:-D_MUDFLAP -include mf-runtime.h} %{fmudflapth:-D_MUDFLAP -D_MUDFLAPTH -include mf-runtime.h} %{E|M|MM:%W{o*}}

*trad_capable_cpp:
cc1 -E %{traditional|ftraditional|traditional-cpp:-traditional-cpp}

*cc1:
%(cc1_cpu) %{profile:-p}

*cc1_options:
%{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}} %1 %{!Q:-quiet} -dumpbase %B %{d*} %{m*} %{a*} %{c|S:%{o*:-auxbase-strip %*}%{!o*:-auxbase %b}}%{!c:%{!S:-auxbase %b}} %{g*} %{O*} %{W*&pedantic*} %{w} %{std*&ansi&trigraphs} %{v:-version} %{pg:-p} %{p} %{f*} %{undef} %{Qn:-fno-ident} %{--help:--help} %{--target-help:--target-help} %{!fsyntax-only:%{S:%W{o*}%{!o*:-o %b.s}}} %{fsyntax-only:-o %j} %{-param*} %{fmudflap|fmudflapth:-fno-builtin -fno-merge-constants} %{coverage:-fprofile-arcs -ftest-coverage}

*cc1plus:


*link_gcc_c_sequence:
%{static:--start-group} %G %L %{static:--end-group}%{!static:%G}

*link_ssp:
%{fstack-protector:}

*endfile:
%{ffast-math|funsafe-math-optimizations:crtfastmath.o%s}    %{shared|pie:crtendS.o%s;:crtend.o%s} crtn.o%s

*link:
%{!static:--eh-frame-hdr} %{!m32:-m elf_x86_64} %{m32:-m elf_i386}   %{shared:-shared}   %{!shared:     %{!static:       %{rdynamic:-export-dynamic}       %{m32:%{!dynamic-linker:-dynamic-linker %{muclibc:%{mglibc:%e-mglibc and -muclibc used together}/lib/ld-uClibc.so.0;:/lib/ld-linux.so.2}}}       %{!m32:%{!dynamic-linker:-dynamic-linker %{muclibc:%{mglibc:%e-mglibc and -muclibc used together}/lib/ld64-uClibc.so.0;:/lib64/ld-linux-x86-64.so.2}}}}     %{static:-static}}

*lib:
%{pthread:-lpthread}    %{shared:-lc}    %{!shared:%{mieee-fp:-lieee} %{profile:-lc_p}%{!profile:-lc}}

*mfwrap:
 %{static: %{fmudflap|fmudflapth:  --wrap=malloc --wrap=free --wrap=calloc --wrap=realloc --wrap=mmap --wrap=munmap --wrap=alloca} %{fmudflapth: --wrap=pthread_create}} %{fmudflap|fmudflapth: --wrap=main}

*mflib:
%{fmudflap|fmudflapth: -export-dynamic}

*link_gomp:


*libgcc:
%{static|static-libgcc:-lgcc -lgcc_eh}%{!static:%{!static-libgcc:%{!shared-libgcc:-lgcc --as-needed -lgcc_s --no-as-needed}%{shared-libgcc:-lgcc_s%{!shared: -lgcc}}}}

*startfile:
%{!shared: %{pg|p|profile:gcrt1.o%s;pie:Scrt1.o%s;:crt1.o%s}}    crti.o%s %{static:crtbeginT.o%s;shared|pie:crtbeginS.o%s;:crtbegin.o%s}

*switches_need_spaces:


*cross_compile:
0

*version:
4.2.1

*multilib:
. !m64 !m32;64:../lib64 m64 !m32;32:../lib !m64 m32;

*multilib_defaults:
m64

*multilib_extra:


*multilib_matches:
m64 m64;m32 m32;

*multilib_exclusions:


*multilib_options:
m64/m32

*linker:
collect2

*link_libgcc:
%D

*md_exec_prefix:


*md_startfile_prefix:


*md_startfile_prefix_1:


*startfile_prefix_spec:


*sysroot_spec:
--sysroot=%R

*sysroot_suffix_spec:


*sysroot_hdrs_suffix_spec:


*cc1_cpu:
%{!mtune*: %{m386:mtune=i386 %n`-m386' is deprecated. Use `-march=i386' or `-mtune=i386' instead.
} %{m486:-mtune=i486 %n`-m486' is deprecated. Use `-march=i486' or `-mtune=i486' instead.
} %{mpentium:-mtune=pentium %n`-mpentium' is deprecated. Use `-march=pentium' or `-mtune=pentium' instead.
} %{mpentiumpro:-mtune=pentiumpro %n`-mpentiumpro' is deprecated. Use `-march=pentiumpro' or `-mtune=pentiumpro' instead.
} %{mcpu=*:-mtune=%* %n`-mcpu=' is deprecated. Use `-mtune=' or '-march=' instead.
}} %<mcpu=* %{mintel-syntax:-masm=intel %n`-mintel-syntax' is deprecated. Use `-masm=intel' instead.
} %{mno-intel-syntax:-masm=att %n`-mno-intel-syntax' is deprecated. Use `-masm=att' instead.
}%{march=native:%<march=native %:local_cpu_detect(arch)   %{!mtune=*:%<mtune=native %:local_cpu_detect(tune)}} %{mtune=native:%<mtune=native %:local_cpu_detect(tune)}

*link_command:
%{!fsyntax-only:%{!c:%{!M:%{!MM:%{!E:%{!S:    %(linker) %l %{pie:-pie} %X %{o*} %{A} %{d} %{e*} %{m} %{N} %{n} %{r}    %{s} %{t} %{u*} %{x} %{z} %{Z} %{!A:%{!nostdlib:%{!nostartfiles:%S}}}    %{static:} %{L*} %(mfwrap) %(link_libgcc) %o    %{fopenmp:%:include(libgomp.spec)%(link_gomp)} %(mflib)    %{fprofile-arcs|fprofile-generate|coverage:-lgcov}    %{!nostdlib:%{!nodefaultlibs:%(link_ssp) %(link_gcc_c_sequence)}}    %{!A:%{!nostdlib:%{!nostartfiles:%E}}} %{T*} }}}}}}


Windows Vista? *NEVER* Het waarom - Opera forever!!!
I've seen chickens that were more menacing. Chickens in a coma. On ice. In my fridge


  • Xiphalon
  • Registratie: Juni 2001
  • Laatst online: 30-01 17:11
Darkvater schreef op zaterdag 10 november 2007 @ 15:26:
[...]
code:
1
2
3
Darkvater@arrakis:/tmp> gcc -m32 test.cc -l/usr/lib/libstdc++.so.6.0.9
/usr/lib64/gcc/x86_64-suse-linux/4.2.1/../../../../x86_64-suse-linux/bin/ld: cannot find -l/usr/lib/libstdc++.so.6.0.9
collect2: ld returned 1 exit status
ho typo: geen -l voor de library, de lib dus opgeven als een sourcefile.

doe voor de gein eens een ls -l /usr/lib/libstdc* ,kijken of het niet alleen losse links zijn die naar niets wijzen

  • Darkvater
  • Registratie: Januari 2001
  • Laatst online: 26-08-2024

Darkvater

oh really?

Topicstarter
darkmage schreef op zaterdag 10 november 2007 @ 15:33:
[...]

ho typo: geen -l voor de library, de lib dus opgeven als een sourcefile.

doe voor de gein eens een ls -l /usr/lib/libstdc* ,kijken of het niet alleen losse links zijn die naar niets wijzen
Hmm, interessant...
code:
1
2
3
4
lrwxrwxrwx 1 root root     18 2007-11-08 19:08 /usr/lib/libstdc++.so.5 -> libstdc++.so.5.0.7
-rwxr-xr-x 1 root root 768628 2007-09-22 00:03 /usr/lib/libstdc++.so.5.0.7
lrwxrwxrwx 1 root root     18 2007-11-08 19:08 /usr/lib/libstdc++.so.6 -> libstdc++.so.6.0.9
-rwxr-xr-x 1 root root 948824 2007-09-21 20:06 /usr/lib/libstdc++.so.6.0.9


stdc opgeven als een sourcefile werkt gewoon :o
code:
1
2
3
Darkvater@arrakis:/tmp> gcc -m32 test.cc /usr/lib/libstdc++.so.6.0.9
tfarago@arrakis:/tmp> file a.out
a.out: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.4, dynamically linked (uses shared libs), not stripped

Nu is het de vraag waarom het zo wel werkt. Want het is nu goed dat ie het doet voor mijn testprogramma, maar betekent dit dat elke keer dat ik in 32bits een project wil compileren op mijn linux, ik elke makefile moet herschrijven omdat anders het linken niet werkt? :|

Maar noline, dit is al een stap vooruit :) (sorry darkmage voor de typo)


Windows Vista? *NEVER* Het waarom - Opera forever!!!
I've seen chickens that were more menacing. Chickens in a coma. On ice. In my fridge


  • Xiphalon
  • Registratie: Juni 2001
  • Laatst online: 30-01 17:11
kijk
./usr/lib/libstdc++.so.5
./usr/lib/libstdc++.so.6.0.9
./usr/lib/libstdc++.so.5.0.7
./usr/lib/libstdc++.so.6
./usr/lib64/gcc/x86_64-suse-linux/4.2.1/libstdc++.a
./usr/lib64/gcc/x86_64-suse-linux/4.2.1/libstdc++.so
./usr/lib64/libstdc++.so.5
./usr/lib64/libstdc++.so.6.0.9
./usr/lib64/libstdc++.so.5.0.7
./usr/lib64/libstdc++.so.6
Als g++ -lstdc++ nodig heeft gaat hij zoeken naar libstdc++.{a,so} in het zoekpad.

Voor de 32 bit versie is die er niet :)

Linkje maken van /usr/lib/libstdc++.so -> /usr/lib/libstdc++.so.6 en het werkt als het goed is.

En libraries (en object files) meegeven aan g++ werkt gewoon, hij bepaald per type file zelf wat er mee moet gebeuren.

  • Darkvater
  • Registratie: Januari 2001
  • Laatst online: 26-08-2024

Darkvater

oh really?

Topicstarter
darkmage schreef op zaterdag 10 november 2007 @ 18:33:
Als g++ -lstdc++ nodig heeft gaat hij zoeken naar libstdc++.{a,so} in het zoekpad.

Voor de 32 bit versie is die er niet :)

Linkje maken van /usr/lib/libstdc++.so -> /usr/lib/libstdc++.so.6 en het werkt als het goed is.

En libraries (en object files) meegeven aan g++ werkt gewoon, hij bepaald per type file zelf wat er mee moet gebeuren.
Darkmage, dank je wel. Dat was het. Ik heb linkjes gemaakt van alle missende libraries, en het programma is gelinkt, en werkend :D
Ik heb hier niet eens aan gedacht, want in principe zijn dan de 32bits libraries die SUSE meelevert onvolledig. Naja, opgelost :) Nogmaals bedankt.


Windows Vista? *NEVER* Het waarom - Opera forever!!!
I've seen chickens that were more menacing. Chickens in a coma. On ice. In my fridge


  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Opgelost? Weet je al waarom Suse die libs niet meeleverd dan?
Als het echt een fout is, zou een bug report richting Suse handig zijn.

  • Darkvater
  • Registratie: Januari 2001
  • Laatst online: 26-08-2024

Darkvater

oh really?

Topicstarter
Olaf van der Spek schreef op zondag 11 november 2007 @ 12:49:
[...]

Opgelost? Weet je al waarom Suse die libs niet meeleverd dan?
Als het echt een fout is, zou een bug report richting Suse handig zijn.
Opgelost voor mij :). Ik ga wel morgen ofzo tijdens werk bij SUSE op irc kijken hoe het precies zit.


Windows Vista? *NEVER* Het waarom - Opera forever!!!
I've seen chickens that were more menacing. Chickens in a coma. On ice. In my fridge


  • Darkvater
  • Registratie: Januari 2001
  • Laatst online: 26-08-2024

Darkvater

oh really?

Topicstarter
Heb het nagevraagd en voor mensen die ook hetzelfde probleem hebben; je moet alle devel-32bit libraries installeren. Dus als je xorg-X11-devel hebt, ook xorg-X11-devel-32bit installeren als je 32bits programma's wil maken. Ergens logisch, maar die 32bit devels voegen alleen maar een paar so's toe, geen headers niks, dus een beetje verwarrend (programma compile-t wel, maar linkt niet zonder dus je denkt dat je alles hebt)


Windows Vista? *NEVER* Het waarom - Opera forever!!!
I've seen chickens that were more menacing. Chickens in a coma. On ice. In my fridge


  • Darkvater
  • Registratie: Januari 2001
  • Laatst online: 26-08-2024

Darkvater

oh really?

Topicstarter
Mijn antwoord is niet volledig omdat van sommige libraries die nodig waren voor mijn project (mplayerplugin) geen libXXX-devel-32bit packages van. Heb dit nog maar een keer voorgelegd aan SUSE, zal mijn post wat later updaten met hun antwoord.


Windows Vista? *NEVER* Het waarom - Opera forever!!!
I've seen chickens that were more menacing. Chickens in a coma. On ice. In my fridge

Pagina: 1