🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.os.linux.programowanie
4 messages
4 total messages Started by Andrzej Radecki Thu, 02 Sep 1999 15:56
OGLOSZENIE: disassembler
#133
Author: Andrzej Radecki
Date: Thu, 02 Sep 1999 15:56
72 lines
3570 bytes
Witam!

Napisałem nakładkę (parser) na objdump'a. Działa to tak:

objdump -x --source <plik wykonywalny>|disasm
lub
objdump -xd <plik wykonywalny>|disasm

Parser  ten  konwertuje  to  co wypluwa objdump do postaci pliku html w ten
sposób, że każdemu skokowi odpowiada odnośnik. Przy czym można poruszać się
nie  tylko  w  kierunku  wywoływania  funkcji  ale i odwrotnym - przejść do
miejsca, z którego została wywołana funkcja. Myślę, że  najlepiej  wyjaśnić
to na przykładzie: (zrzut ekranu z Lynx'a)


int findstr(const char *dest, const char *source)
{

8048a6a 8048a7b 8048b62 8048b9e 8048e79
8048f0e 8048f88 8048fa2 8048fbc 8048fd6
8048ff0 804900a 8049024 804903e 8049058  <-*tu* są odnośniki
8049072 804908c 80490a6 80490c0 80490da    do punktów, z 
80490f4 804910e 8049128 8049142 804915c    nastąpił skok
8049176 8049190 80491aa 80491c4 80491de    do tego miejsca
80491f8 8049212 804922c 8049246 804925c
8049272 8049288 804929e 80492b4
 80487f0:       55              pushl  %ebp
 80487f1:       89 e5           movl   %esp,%ebp
 80487f3:       83 ec 04        subl   $0x4,%esp
 80487f6:       57              pushl  %edi
 80487f7:       56              pushl  %esi
 80487f8:       53              pushl  %ebx
   int i,j;
   int dlength=strlen(dest);
 80487f9:       30 c0           xorb   %al,%al
 80487fb:       8b 7d 08        movl   0x8(%ebp),%edi
[...]
 8048826:       39 c3           cmpl   %eax,%ebx
 8048828:       7f 33           jg     804885d <findstr+0x6d> <-a *tu*
 804882a:       89 c7           movl   %eax,%edi      jest odnośnik do
    for (j=0; j < slength; j++)                       adresu 0x804885d

Poza  tym wstawia do instrukcji skoków nazwy procedur linkowanych dynamicz­
nie. (nie wiem dlaczego objdump zostawiał w tych miejscach numerki)

W  sumie  te  funkcje  to  żadna nowość, wcześniej spotkałem się z podobnie
działającym programem pod Win* (w32dasm). Na własnej skórze przekonałem się
jak  pożyteczne  to  narzędzie.  ;-)  To  rozwiązanie ma również wady. Naj­
ważniejszą jest wrażliwość na funkcje  wirtualne  (nie  sposób  ustalić  co
znajduje  się  w  rejestrze  bez  uruchamiania  programu).  Drugą wadą jest
czasochłonność.  Tych  odnośników  jest  naprawdę  dużo  więc  przy  dużych
programach  mogą  pojawić  się problemy. Właśnie dlatego napisałem to w C a
nie np. perlu - może choć trochę przyspieszy to operacje.

Program testowałem wraz z objdump'em w wersji:
GNU objdump 2.9.1
na formacie plików:
elf32-i386

Jeśli  ktoś  zauważy  jakieś  problemy,  pokusi  się o jakieś zmiany lub ma
jakieś pomysły to proszę o kontakt.

Program można znaleźć pod adresem:
http://www.wpk.p.lodz.pl/~radecki/disasm.tar.gz

Później skrobnę jeszcze do niego odpowiednią stronkę.

Pozdrawiam,
-- 
(    /6/  Andrzej Radecki
 ====  \  radecki@wpk.p.lodz.pl
/   |     http://www.wpk.p.lodz.pl/~radecki
Re: disassembler
#134
Author: Andrzej Radecki
Date: Fri, 03 Sep 1999 15:42
53 lines
2686 bytes
Andrzej Radecki <radecki@wpk.p.lodz.pl> pisze:
>Napisałem nakładkę (parser) na objdump'a. Działa to tak:
[...]

Poprawiłem nieco kod. Teraz zamiast:

[and /d/home/and/zrodla/disasm/jed_tmp]$ date; cat jed|./disasm; date
pią wrz  3 10:24:17 CEST 1999
Disassembler parser Rev 0.01 2.IX.1999 Andrzej Radecki
[...]
pią wrz  3 10:49:45 CEST 1999

jest:

[and /d/home/and/zrodla/disasm/jed_tmp]$ date; cat jed|./disasm; date
pią wrz  3 16:47:10 CEST 1999
Disassembler parser Rev 0.01 2.IX.1999 Andrzej Radecki
[...]
pią wrz  3 16:50:00 CEST 1999

8x szybciej to chyba nieźle ;-) (ale to raczej "zasługa" głupiego algorytmu
zastosowanego   w   poprzedniej   wersji).    Program    uruchamiałem    na
486dx-50MHz/16MB.  Teraz  zależność  czasu  wykonywania  do wielkości pliku
wejściowego jest _znacznie_ bardziej liniowa przez  co  przyrost  prędkości
w  stosunku  do  poprzedniej  wersji  jest tym bardziej widoczny im większy
plik. Plik 'jed' utworzony był przez:

$ objdump -x --source /usr/local/bin/jed > jed

Teraz prośba(y):

Nie  wiecie  gdzie  znaleźć  jakiś  porządny  "walidator" html'a? Ciężko mi
sprawdzić  wygenerowane  pliki  ręcznie  gdy  ich  rozmiar  sięga  3MB  jak
w powyższym przykładzie. A pliki generowane różnymi wersjami programu nieco
się różnią choć 'na oko' nie widać w żadnym z nich błędów.

Chciałbym  aby  ktoś  doświadczony  w  programowaniu  w  C  obejrzał kod bo
zastosowałem takie naprędce wymyślone indeksowanie listy danych i nie  wiem
czy zrobiłem to prawidłowo (trochę się w tym gubiłem).

Czy jest jakaś przeglądarka hipertekstowa potrafiąca odczytać jakiś binarny
indeks odnośników? Problem w tym, że lynx długo  wczytuje  pliki  wyjściowe
(de  facto  powtarza  on  tą  samą  czynność,  którą  wykonał mój program -
tworzenie indeksu odnośników).

Nowa wersja (0.02) jest tam gdzie poprzednio, czyli:
http://www.wpk.p.lodz.pl/~radecki/disasm.tar.gz

Pozdrawiam,
-- 
(    /6/  Andrzej Radecki
 ====  \  radecki@wpk.p.lodz.pl
/   |     http://www.wpk.p.lodz.pl/~radecki
Re: disassembler
#135
Author: Adam Przybyla
Date: Sat, 04 Sep 1999 11:32
39 lines
2292 bytes
Andrzej Radecki <radecki@wpk.p.lodz.pl> wrote:
> Andrzej Radecki <radecki@wpk.p.lodz.pl> pisze:
>>Napisałem nakładkę (parser) na objdump'a. Działa to tak:
> [...]

> Poprawiłem nieco kod. Teraz zamiast:

> [and /d/home/and/zrodla/disasm/jed_tmp]$ date; cat jed|./disasm; date
> pią wrz  3 10:24:17 CEST 1999
> Disassembler parser Rev 0.01 2.IX.1999 Andrzej Radecki
> [...]
> pią wrz  3 10:49:45 CEST 1999

> jest:

> [and /d/home/and/zrodla/disasm/jed_tmp]$ date; cat jed|./disasm; date
> pią wrz  3 16:47:10 CEST 1999
> Disassembler parser Rev 0.01 2.IX.1999 Andrzej Radecki
> [...]
> pią wrz  3 16:50:00 CEST 1999

> 8x szybciej to chyba nieźle ;-) (ale to raczej "zasługa" głupiego algorytmu
> zastosowanego   w   poprzedniej   wersji).    Program    uruchamiałem    na
> 486dx-50MHz/16MB.  Teraz  zależność  czasu  wykonywania  do wielkości pliku
> wejściowego jest _znacznie_ bardziej liniowa przez  co  przyrost  prędkości
> w  stosunku  do  poprzedniej  wersji  jest tym bardziej widoczny im większy
> plik. Plik 'jed' utworzony był przez:

> $ objdump -x --source /usr/local/bin/jed > jed

> Teraz prośba(y):

> Nie  wiecie  gdzie  znaleźć  jakiś  porządny  "walidator" html'a? Ciężko mi
> sprawdzić  wygenerowane  pliki  ręcznie  gdy  ich  rozmiar  sięga  3MB  jak
> w powyższym przykładzie. A pliki generowane różnymi wersjami programu nieco
> się różnią choć 'na oko' nie widać w żadnym z nich błędów.
	... zobacz http://sun.iinf.polsl.gliwice.pl/~adam/kompilatory.html
Z powazaniem
								Adam Przybyla
Re: disassembler
#136
Author: Dawid Kuroczko
Date: Sat, 04 Sep 1999 20:10
16 lines
1697 bytes
3 września, godzina 15:42, na pl.comp.os.linux.programowanie pisze Andrzej Radecki:
> Nie  wiecie  gdzie  znaleźć  jakiś  porządny  "walidator" html'a? Ciężko mi
> sprawdzić  wygenerowane  pliki  ręcznie  gdy  ich  rozmiar  sięga  3MB  jak
> w powyższym przykładzie. A pliki generowane różnymi wersjami programu nieco
> się różnią choć 'na oko' nie widać w żadnym z nich błędów.

Zobacz nsgmls.  Jest to część sgml-tools i/lub Jade.
Jak dla mnie działa świetnie. :)

     Pozdrawiam,
      Dawid Kuroczko
-- 
  .------------------.       .----------.  ...and the net becomes my bride
  | *Dawid Kuroczko* `--.---=' _Kraków_ |  so in her I do confide
  | q n e x @pld.org.pl | Member of PLD |  and she keeps me satisfied
  `---------------------"---------------'  gives me all I need
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads