prosze o kontakt e-mailowy
bdr...@poczta.gazeta.pl
#v+
#include <stdio.h>
int main()
{
printf("Hello world!\n");
return 0;
}
#v-
Ile zarobiłem?
BP, NMSP
--
Zabytek (z ruskiego "ZABYT"-zapomnieć) obiekt nie wart pamiętania.
int main(){
return(0);};
jak ma byc prosty to prosty.
To jeszcze to sformatuj jakoś.
> jak ma byc prosty to prosty.
Jak ma być prosty i pod Linux-x86, to lepsze chyba będzie to:
#v+
int main = 12828721;
#v-
No i ostrzeżenie kompilatora jest rozbrajające :)
--
Feel free to correct my English
Stanislaw Klekot
> int main = 12828721;
skąd akurat taka wartość?
--
| pozdrawiam / greetings | powered by Trustix, Gentoo and FreeBSD |
| Kajetan Staszkiewicz | JID: veg...@chrome.pl |
| Vegeta | IMQ devnames: http://tuxpowered.net |
`------------------------^----------------------------------------'
> Jak ma być prosty i pod Linux-x86, to lepsze chyba będzie to:
> #v+
> int main = 12828721;
> #v-
> No i ostrzeżenie kompilatora jest rozbrajające :)
[...]
Nic ciekawego nie ma. Możesz wkleić z jakimi parametrami kompilowałeś oraz
ten rozbrajający komunikat?
Oraz gcc -v
pozdrawiam
--
Łukasz Głębicki mail/rot13:yhxn...@cbfg.cy PLD/Linux Team
gg:246267 Linux Registered User #318551 blekot:{irc,skype}
Student of Warsaw University of Technology, Faculty of Mechatronics
mkedzier@helios ~/user_data $ gcc -Wall ./a.c
--
Mariusz Kędzierawski
+---------------------------------------------------------------------+
Sens życia to jedyny narkotyk, od którego wszyscy chcą się uzależnić.
+---------------------------------------------------------------------+
Z assemblera. Żeby ładnie się zero znalazło w EAX, a potem żeby ładnie
się RET wykonało.
#v+
[dozzie@hans dozzie]$ perl -e 'print pack "I", 12828721' > asmcode.bin
[dozzie@hans dozzie]$ ndisasm -b 32 asmcode.bin
00000000 31C0 xor eax,eax
00000002 C3 ret
00000003 00 db 0x00
[dozzie@hans dozzie]$
#v-
main zwykle jest funkcją, zatem pod symbolem "main" znajduje się
początek kodu, który należy wykonać. Dla linkera to tylko etykieta dla
jakiegoś adresu (dla jakiejś liczby). Podobnie jest z "int main;": dla
linkera to dalej jest etykieta dla jakiegoś adresu w pamięci, tyle że
tym razem pod tym adresem znajdują się dane innego typu (tutaj: int).
Jeśli wpisałbym tam cokolwiek, to to cokolwiek zaczęłoby się wykonywać
jako kod maszynowy, więc wpakowałem tam nawet całkiem sensowny kod.
To samo można napisać tak:
#v+
int main [] = {0xc0c3, 0x0031};
#v-
--
Piotr Sietnik
p...@pk.mofnet.gov.pl
Mnie bardziej rozbraja to:
[jd@documentation handler]$ cat main.cc
int main = 12828721;
[jd@documentation handler]$ g++ -pedantic -Wall main.cc
[jd@documentation handler]$ g++ -v
Reading specs from
/mnt/hda5/usr/bin/../lib/gcc/i386-redhat-linux/4.0.0/specs
[...]
gcc version 4.0.0 20041019 (Red Hat 4.0.0-0.8)
Nawet nie mrugnął lampką.
JD
> Nawet nie mrugnął lampką.
U mnie jest tak samo :(
--
Zbigniew Malec Ustronie:104 gg:2756100
Nie, nie można tak zapisać. Jeden int to cztery bajty, więc w pierwszym
elemencie tablicy dostaniesz dwa 0x00 po XOR EAX, EAX. Program zginie
śmiercią SIGILL. Co innego short main[] (albo char main[]).
O. U mnie to wygląda tak:
#v+
[dozzie@hans lol]$ gcc -Wall -o /dev/null small.c
small.c:1: warning: `main' is usually a function
[dozzie@hans lol]$ gcc -v
Reading specs from /usr/lib/gcc-lib/i486-slackware-linux/3.3.6/specs [...]
Thread model: posix
gcc version 3.3.6
[dozzie@hans lol]$
#v-
Żeby było śmieszniej:
#v+
[dozzie@dynamit dozzie]$ gcc -Wall small.c -o /dev/null
small.c:1: warning: 'main' is usually a function
[dozzie@dynamit dozzie]$ gcc -v
Using built-in specs.
Target: i486-linux-gnu
Configured with: [...]
Thread model: posix
gcc version 4.0.3 20051201 (prerelease) (Debian 4.0.2-5)
[dozzie@dynamit dozzie]$
No tak, ale chodziło o to, że g++ mimo -pedantic i -Wall nic nie powiedział.
Plik nazywał się main.cc.
Dodam też, że u mnie ten program, kompilowany tak jak podałeś, ginie z
komunikatem "Segmentation fault".
JD
No fakt, g++ u mnie też nic nie powiedział. Inna sprawa, że to było C,
nie C++.
> Dodam też, że u mnie ten program, kompilowany tak jak podałeś, ginie z
> komunikatem "Segmentation fault".
A u mnie nie, u mnie wszystko w porządku. I to niezależnie od tego, czy
był kompilowany jako C, czy jako C++. Sprawdzane na Athlonie XP,
Pentium II i Pentium IV.
Wydaje mi się, że to nie jest ani poprawne C ani C++, po prostu trick, tak
jak dziedziczenie po std::vector<> - niektórzy to robią i im to działa, inni
próbują i giną marnie.
> > Dodam też, że u mnie ten program, kompilowany tak jak podałeś, ginie z
> > komunikatem "Segmentation fault".
>
> A u mnie nie, u mnie wszystko w porządku. I to niezależnie od tego, czy
> był kompilowany jako C, czy jako C++. Sprawdzane na Athlonie XP,
> Pentium II i Pentium IV.
Pokombinuję jeszcze, może coś się okaże. Ja mam Fedore, Ty Slacka, może to
to?
JD
Bo taki kod funkcji main() trafi do segmentu danych. Pewnie kernel
u Ciebie nie pozwala na wykonanie kodu z segmentu danych (jako
zabezpieczenie przeciw exploitom typu buffer overflow, oczywiście).
Tomasz Łukaszewski
O, dzięki za info. Tak kombinowałem, ale wiedzy mi zabrakło :)
JD
> Jak ma być prosty i pod Linux-x86, to lepsze chyba będzie to:
> #v+
> int main = 12828721;
> #v-
> No i ostrzeżenie kompilatora jest rozbrajające :)
mi nic nie napisal
szczepan@trypel:~$ gcc 1.c
szczepan@trypel:~$
pozdrawiam
iu1j4
--
.: DLJ PROJECT :.
.: Jarosław Siebert :.
........: jsie...@poczta.wp.pl :.........
.: Lru: 255615 | tel: 603877428 | Gg: 560046:.
>> A u mnie nie, u mnie wszystko w porządku. I to niezależnie od tego, czy
>> był kompilowany jako C, czy jako C++. Sprawdzane na Athlonie XP,
>> Pentium II i Pentium IV.
>
> Pokombinuję jeszcze, może coś się okaże. Ja mam Fedore, Ty Slacka, może to
> to?
Z tego co widać to on ma Debiana
#v+
[dozzie@dynamit dozzie]$ gcc -v
Using built-in specs.
Target: i486-linux-gnu
Configured with: [...]
Thread model: posix
gcc version 4.0.3 20051201 (prerelease) (Debian 4.0.2-5)
[dozzie@dynamit dozzie]$
#v-
Slackware mam ja... :-) Podczas kompilacji dostaję tylko jedna liniję
tekstu:
#v+
gcc -Wall -pedantic program.c
program.c:1: warning: 'main' is usually a function
#v-
Samo uruchomienie programu przebiega bez problemów.
Pozdrawiam
Jakiś minimalny przykład kodu chętnie bym zobaczył, co to u jednych
działa a u innych nie.
Nie mam, Slacka miał Dozzie.
JD
Sugerowałem się tym:
/usr/lib/gcc-lib/i486-slackware-linux/3.3.6/specs
JD
Jeżeli dziedziczysz dodając same metody a nie pola, to zwykle działa. Jak
dodajesz pola, to zwykle nie działa, bo destruktor nie jest wirtualny.
JD
Bo nie przeczytałeś innych postów, w których jest wyraźnie napisane, że
należy dodać -Wall.
JD
No tak coś mi się kolejność bajtów powaliła, Tobie zresztą też, bo
to co dostaję, to:
#v+
ret
rolb $0x0,(%eax)
xor %eax,(%eax)
add %al,(%eax)
#v-
No, ale można tak:
#v+
int main [] = {0x00c3c031};
#v-
> Co innego short main[] (albo char main[]).
W żadnym razie tak, bo main musi być int.
--
Piotr Sietnik
p...@pk.mofnet.gov.pl
#v+
$ cc -Wall -pedantic -std=c99 cc.c
cc.c:1: warning: 'main' is usually a function
$ cc -v
Using built-in specs.
Configured with: FreeBSD/i386 system compiler
Thread model: posix
gcc version 3.4.4 [FreeBSD] 20050518
#v-
> Samo uruchomienie programu przebiega bez problemów.
Tak samo.
--
Piotr Sietnik
p...@pk.mofnet.gov.pl
Racja. Założyłem, że podałeś poprawny kod ({0xc031, 0xc3}), tylko
z niepoprawnymi rozmiarami, zamiast samemu sprawdzić.
I obaj mieliście rację: mam i Debiana, i Slackware (na różnych
maszynach; na obu dystrybucję wybierałem sam).