Kirjoittaja Aihe: 32 vs 64 bittinen C ohjelmointi ongelma RATKAISTU  (Luettu 2848 kertaa)

kari_salo

  • Käyttäjä
  • Viestejä: 14
    • Profiili
C softa joka ja käännetty ja testattu 64 bittisessä ei toimi 32 bittisessä. Kääntyy kyllä 32 bittisessä virheittä. Mistähän lähtis vikaa etsimään. Saattais olla tiedostojen käsittely ongelma.

tuon verran löytyi ruudulta vihjettä

*** stack smashing detected ***: ./com terminated
                                                 ======= Backtrace: =========

/lib/tls/i686/cmov/libc.so.6(__fortify_fail+0x48)[0xb7ff6da8]
/lib/tls/i686/cmov/libc.so.6(__fortify_fail+0x0)[0xb7ff6d60]
./com[0x804a0e8][0x616e6961]
                  ======= Memory map: ========
08048000-0804b000 r-xp 00000000 08:06 695000     /home/koneistus/programs/com
0804b000-0804c000 r--p 00002000 08:06 695000     /home/koneistus/programs/com
0804c000-0804d000 rw-p 00003000 08:06 695000     /home/koneistus/programs/com
09e1f000-09e40000 rw-p 09e1f000 00:00 0          [heap]
b7ef8000-b7ef9000 rw-p b7ef8000 00:00 0
b7ef9000-b8055000 r-xp 00000000 08:01 188667     /lib/tls/i686/cmov/libc-2.9.so
b8055000-b8056000 ---p 0015c000 08:01 188667     /lib/tls/i686/cmov/libc-2.9.so
b8056000-b8058000 r--p 0015c000 08:01 188667     /lib/tls/i686/cmov/libc-2.9.so
b8058000-b8059000 rw-p 0015e000 08:01 188667     /lib/tls/i686/cmov/libc-2.9.so
b8059000-b805c000 rw-p b8059000 00:00 0
b805e000-b806b000 r-xp 00000000 08:01 171089     /lib/libgcc_s.so.1
b806b000-b806c000 r--p 0000c000 08:01 171089     /lib/libgcc_s.so.1
b806c000-b806d000 rw-p 0000d000 08:01 171089     /lib/libgcc_s.so.1
b806d000-b8070000 rw-p b806d000 00:00 0
b8070000-b8071000 r-xp b8070000 00:00 0          [vdso]
b8071000-b808d000 r-xp 00000000 08:01 171047     /lib/ld-2.9.so
b808d000-b808e000 r--p 0001b000 08:01 171047     /lib/ld-2.9.so
b808e000-b808f000 rw-p 0001c000 08:01 171047     /lib/ld-2.9.so
bf879000-bf88e000 rw-p bffeb000 00:00 0          [stack]
                                         Keskeytetty
koneistus@koneistus-desktop:~/programs$
« Viimeksi muokattu: 18.09.09 - klo:15.55 kirjoittanut kari_salo »

_Pete_

  • Käyttäjä
  • Viestejä: 1836
  • Fufufuuffuuu
    • Profiili
Vs: 32 vs 64 bittinen C ohjelmointi ongelma
« Vastaus #1 : 10.09.09 - klo:09.16 »
Käännä se debug-symboleilla ja sitten ajat gdb:llä ja kun kosahtaa katsota backtracea niin ei tarvi arvailla.


Jani Salonen

  • Käyttäjä
  • Viestejä: 5
    • Profiili
    • Kotikontu
Vs: 32 vs 64 bittinen C ohjelmointi ongelma
« Vastaus #2 : 15.09.09 - klo:14.01 »
stack smashing viittaisi puskuriylivuotoon, eli joku char[10] jossain saattaa olla liian pieni. olethan joka paikassa muistanut että esimes 64bit long on erikokoinen kun 32bit long?
- Jani

Maz

  • Käyttäjä
  • Viestejä: 3
    • Profiili
    • C - ohjelmoijan ajatuksia
Vs: 32 vs 64 bittinen C ohjelmointi ongelma
« Vastaus #3 : 17.09.09 - klo:22.06 »
stack smashing attack - kuulostaa todellakin ylikirjoitukselta. (Usein käyttis tekee jonkinlaisen tarkistuksen stackkiin kirjoitettavile matskuille, jottei ilikiät krakkerit pääsisi muuttamaan mm. stakkiin kirjoitettua funktiostapaluuosoitetta). Villinä arvauksena - ohjelmassa on vanhaan tyyliin harrastettu pointteriaritmetiikkaa castaamalla osoittimia inteiksi. (x386 arkkitehtuurissa sekä int että pointteri on yleensä ollut 32 bittinen. x86_64 arkkitehtuureissa int on yleensä 32 bittinen, ja osoitin 64 bittinen => castauksessa osa osoitteesta leikkautuu pois.)

Mahdollista on myös se, että jokin pointterin palauttava funktio ei ole esiteltynä => paluuarvon defaultti on int => 32 bittisessä x86 systeemssä toimii, 64 bittisessä ei.

gdb ja debuggeri ovat hyviä vaihtoehtoja, samoin kaikkien käännösvaroitusten enablointi ja korjaaminen. Kannattaa myös koettaa 64 bittisessä ympäristössa kääntää 32 bittiseksi, ja kokeilla toimiiko niin.

Mikäli käytät linuxia, kannattaa ehdottomasti koettaa ajaa ohjelma valgrind nimisen muistianalyysityökalun sisällä - tulee lähes joka linux distron mukana.

kari_salo

  • Käyttäjä
  • Viestejä: 14
    • Profiili
Vs: 32 vs 64 bittinen C ohjelmointi ongelma RATKAISTU
« Vastaus #4 : 18.09.09 - klo:15.57 »
 :) Kiitoksia vastauksista.
Puskurin ylivuotohan se oli, muutamalla bytellä  ???

kari_salo

  • Käyttäjä
  • Viestejä: 14
    • Profiili
Vs: 32 vs 64 bittinen C ohjelmointi ongelma RATKAISTU
« Vastaus #5 : 18.09.09 - klo:16.09 »
:) Kiitoksia vastauksista.
Puskurin ylivuotohan se oli, muutamalla bytellä  ???
Ps. Olen taipuvainen ohjelmoijanajatuksiin Maz :)