Helló a következő a probléma:
Elkezdtem írni egy intro-t linux alatt. Pompásan működik, de ha -nostdlib kapcsolóval fordítom, szegmentálási hibával kilép. Itt a backtrace:
Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7198db6 in sprintf () from /lib/libc.so.6
(gdb) bt
#0 0x00007ffff7198db6 in sprintf () from /lib/libc.so.6
#1 0x00007ffff603fa36 in ?? () from /usr/lib64/libGLcore.so.1
#2 0x00007ffff6042d51 in ?? () from /usr/lib64/libGLcore.so.1
#3 0x00007ffff6319d24 in ?? () from /usr/lib64/libGLcore.so.1
#4 0x00007ffff604247e in ?? () from /usr/lib64/libGLcore.so.1
#5 0x00007ffff6081d5e in ?? () from /usr/lib64/libGLcore.so.1
#6 0x00007ffff631a320 in ?? () from /usr/lib64/libGLcore.so.1
#7 0x00007ffff6045aa6 in ?? () from /usr/lib64/libGLcore.so.1
#8 0x00007ffff63175ef in ?? () from /usr/lib64/libGLcore.so.1
#9 0x00007ffff602c65c in ?? () from /usr/lib64/libGLcore.so.1
#10 0x00007ffff654c1b0 in ?? () from /usr/lib64/libGLcore.so.1
#11 0x00007ffff6550c8a in ?? () from /usr/lib64/libGLcore.so.1
#12 0x00007ffff65511d5 in ?? () from /usr/lib64/libGLcore.so.1
#13 0x00007ffff5cdb30d in ?? () from /usr/lib64/libGLcore.so.1
#14 0x00007ffff5ce2d1a in ?? () from /usr/lib64/libGLcore.so.1
#15 0x00007ffff5cd5711 in ?? () from /usr/lib64/libGLcore.so.1
#16 0x00000000004010cb in init_engine () at render.c:28
#17 0x0000000000400fdd in _start () at main.c:41
(gdb) info frame
Stack level 0, frame at 0x7fffffffae48:
rip = 0x7ffff7198db6 in sprintf; saved rip 0x7ffff603fa36
called by frame at 0x7fffffffae68
Arglist at 0x7fffffffad60, args:
Locals at 0x7fffffffad60, Previous frame's sp is 0x7fffffffae48
Saved registers:
rip at 0x7fffffffae40
(gdb) frame 16
#16 0x00000000004010cb in init_engine () at render.c:28
28 glLinkProgram(prg);
(gdb) print prg
$1 = 2
Sajnos a libek strip-elve vannak :(
Igazából annyi lenne a kérdésem, hogy más is belefutott-e már ebbe a problémába.
Lehet saját memcpy-t kéne írnom? valami ilyesmire gyanakszom.
- 4429 megtekintés
Hozzászólások
Mi bajod az stdlib-el? Hacsak nem kernelt írsz, minek akarod kihagyni?!? Annélkül elég zord ám az élet...
- A hozzászóláshoz be kell jelentkezni
Helyspórolásképpen. Kíváncsi vagyok mennyi mindent lehet bepréselni egy linux-os 4k-ba.
Nyilván emberi körülmének közt nem bojgatnám :)
--------------------------------------------------------------------
It has been said that the only standard thing about all UNIX systems
is the message-of-the-day telling users to clean up their files.
-- System V.2 administrator's guide
- A hozzászóláshoz be kell jelentkezni
egyatalan, le lehet forditani stdlib nelkul egy _futtatando_ alkalmazast? avagy, `man gcc`, -nostdlib szekciobol:
No startup files...
szoval igy azok a fuggvenyek (belepesi pontok) se kerulnek beforditasra, amik a main()-t maga't meghivjak:
$ cat x.c
#include <stdlib.h>
#include <stdio.h>
int main(int argc,char *argv[])
{
return(1);
}
$ gcc -nostdlib -o x x.c
/usr/bin/ld: warning: cannot find entry symbol _start; defaulting to 00000000004000e8
$ ./x
Segmentation fault
$
vagyis de, lefordul, de nem feloldott (relokalt, szep magyar szoval) a main()-hoz kapcsolodo _start szimbolum, es igy segfault-ol, kb azonnal hasal.
ennek a -nostdlib-nek shared object-eknel lehet ertelme (a kernelen tul, ahogy a kollega is irja feljebb), ott elkepzelheto" olyan alkalmazas, aminek vmi miatt nincs expicit (es kozvetett) szuksege a libc-re. a shared lib-eknek sincs belepesi pontjuk, azok is "segfault"-olnak, ha mint binaris elinditana'd o"ket
- A hozzászóláshoz be kell jelentkezni
ha nem használok shader-t (nincs glLinkProgram -> nincs sprintf() ) úgy működik.
azért kapsz segfault-ot, mert nem lépsz ki. tegyél egy exit(EXIT_SUCCES);-t a végére és ne main legyen a neve, hanem _start.
--------------------------------------------------------------------
It has been said that the only standard thing about all UNIX systems
is the message-of-the-day telling users to clean up their files.
-- System V.2 administrator's guide
- A hozzászóláshoz be kell jelentkezni
az exit() is a libc-ben van benne, ugy le sem fordul ;]
de akkor nem ertem, kicsit megkavarodtam. egy ilyen progik, hogy
_start()
{
return(1);
}
le is fordul, hiba (warn) nelkul, de ugyanugy segfault. exit() ill _exit() meg nem segit (ugy tovabbra sem fordul le)
- A hozzászóláshoz be kell jelentkezni
- A hozzászóláshoz be kell jelentkezni