Nowe posty

Autor Wątek: bash nie widzi pliku, który jest  (Przeczytany 5857 razy)

  • Gość
bash nie widzi pliku, który jest
« dnia: 2011-06-08, 21:02:00 »
Cytuj
tomasz@tomasz-K50IN:~/Dokumenty/prace/assembler/zaliczenie$ nasm -f elf main.asm
tomasz@tomasz-K50IN:~/Dokumenty/prace/assembler/zaliczenie$ ld -o main -e main -l c -l crypt main.o
tomasz@tomasz-K50IN:~/Dokumenty/prace/assembler/zaliczenie$ ./main
bash: ./main: Nie ma takiego pliku ani katalogu
tomasz@tomasz-K50IN:~/Dokumenty/prace/assembler/zaliczenie$ cat makefile
all: main.asm
   nasm -g -o main.o -f elf main.asm
   gcc  -g -lc -lcrypt -o main main.o

.PHONY: clear

clear:
   rm *.o
   rm main
tomasz@tomasz-K50IN:~/Dokumenty/prace/assembler/zaliczenie$ make
nasm -g -o main.o -f elf main.asm
gcc  -g -lc -lcrypt -o main main.o
tomasz@tomasz-K50IN:~/Dokumenty/prace/assembler/zaliczenie$ ./main
123
123
tomasz@tomasz-K50IN:~/Dokumenty/prace/assembler/zaliczenie$ nasm -f elf main.asm
tomasz@tomasz-K50IN:~/Dokumenty/prace/assembler/zaliczenie$ ld -o main -e main -l c -l crypt main.o
tomasz@tomasz-K50IN:~/Dokumenty/prace/assembler/zaliczenie$ ./main
bash: ./main: Nie ma takiego pliku ani katalogu
tomasz@tomasz-K50IN:~/Dokumenty/prace/assembler/zaliczenie$ stat ./main
  File: `./main'
  Size: 2479         Blocks: 8          IO Block: 4096   zwykły plik
Device: 807h/2055d   Inode: 9962071     Links: 1
Access: (0755/-rwxr-xr-x)  Uid: ( 1000/  tomasz)   Gid: ( 1000/  tomasz)
Access: 2011-06-08 20:59:04.167443000 +0200
Modify: 2011-06-08 20:59:00.277499000 +0200
Change: 2011-06-08 20:59:00.277499000 +0200
tomasz@tomasz-K50IN:~/Dokumenty/prace/assembler/zaliczenie$ objdump -x ./main

./main:     file format elf32-i386
./main
architecture: i386, flags 0x00000112:
EXEC_P, HAS_SYMS, D_PAGED
start address 0x08048230

Program Header:
    PHDR off    0x00000034 vaddr 0x08048034 paddr 0x08048034 align 2**2
         filesz 0x000000a0 memsz 0x000000a0 flags r-x
  INTERP off    0x000000d4 vaddr 0x080480d4 paddr 0x080480d4 align 2**0
         filesz 0x00000013 memsz 0x00000013 flags r--
    LOAD off    0x00000000 vaddr 0x08048000 paddr 0x08048000 align 2**12
         filesz 0x000002a8 memsz 0x000002a8 flags r-x
    LOAD off    0x000002a8 vaddr 0x080492a8 paddr 0x080492a8 align 2**12
         filesz 0x00000141 memsz 0x00000141 flags rw-
 DYNAMIC off    0x000002a8 vaddr 0x080492a8 paddr 0x080492a8 align 2**2
         filesz 0x000000a8 memsz 0x000000a8 flags rw-

Dynamic Section:
  NEEDED               libc.so.6
  NEEDED               libcrypt.so.1
  HASH                 0x080480e8
  STRTAB               0x08048160
  SYMTAB               0x08048110
  STRSZ                0x0000003c
  SYMENT               0x00000010
  DEBUG                0x00000000
  PLTGOT               0x08049350
  PLTRELSZ             0x00000010
  PLTREL               0x00000011
  JMPREL               0x080481e8
  VERNEED              0x080481a8
  VERNEEDNUM           0x00000002
  VERSYM               0x0804819c

Version References:
  required from libcrypt.so.1:
    0x0d696910 0x00 03 GLIBC_2.0
  required from libc.so.6:
    0x0d696910 0x00 02 GLIBC_2.0

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .interp       00000013  080480d4  080480d4  000000d4  2**0
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  1 .hash         00000028  080480e8  080480e8  000000e8  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  2 .dynsym       00000050  08048110  08048110  00000110  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  3 .dynstr       0000003c  08048160  08048160  00000160  2**0
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  4 .gnu.version  0000000a  0804819c  0804819c  0000019c  2**1
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  5 .gnu.version_r 00000040  080481a8  080481a8  000001a8  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  6 .rel.plt      00000010  080481e8  080481e8  000001e8  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  7 .plt          00000030  080481f8  080481f8  000001f8  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  8 .text         00000078  08048230  08048230  00000230  2**4
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  9 .dynamic      000000a8  080492a8  080492a8  000002a8  2**2
                  CONTENTS, ALLOC, LOAD, DATA
 10 .got.plt      00000014  08049350  08049350  00000350  2**2
                  CONTENTS, ALLOC, LOAD, DATA
 11 .data         00000085  08049364  08049364  00000364  2**2
                  CONTENTS, ALLOC, LOAD, DATA
SYMBOL TABLE:
080480d4 l    d  .interp   00000000              .interp
080480e8 l    d  .hash   00000000              .hash
08048110 l    d  .dynsym   00000000              .dynsym
08048160 l    d  .dynstr   00000000              .dynstr
0804819c l    d  .gnu.version   00000000              .gnu.version
080481a8 l    d  .gnu.version_r   00000000              .gnu.version_r
080481e8 l    d  .rel.plt   00000000              .rel.plt
080481f8 l    d  .plt   00000000              .plt
08048230 l    d  .text   00000000              .text
080492a8 l    d  .dynamic   00000000              .dynamic
08049350 l    d  .got.plt   00000000              .got.plt
08049364 l    d  .data   00000000              .data
00000000 l    df *ABS*   00000000              main.asm
08048295 l       .text   00000000              searching
0804829f l       .text   00000000              end
0000003d l       *ABS*   00000000              tekst_length_max
08049364 l       .data   00000000              tekst
080493a1 l       .data   00000000              okno
080493de l       .data   00000000              wzorzec
080493e2 l       .data   00000000              sol
080493e5 l       .data   00000000              adres
08049350 l     O .got.plt   00000000              _GLOBAL_OFFSET_TABLE_
080492a8 l     O .dynamic   00000000              _DYNAMIC
00000000       F *UND*   00000000              free@@GLIBC_2.0
00000000       F *UND*   00000000              strlen@@GLIBC_2.0
00000000       F *UND*   00000000              printf@@GLIBC_2.0
080493e9 g       *ABS*   00000000              __bss_start
080493ec g       *ABS*   00000000              _end
00000000       F *UND*   00000000              crypt@@GLIBC_2.0
080493e9 g       *ABS*   00000000              _edata
08048230 g       .text   00000000              main


tomasz@tomasz-K50IN:~/Dokumenty/prace/assembler/zaliczenie$
Takie rzeczy dzieją się, gdy próbuje zlinkować za pomocą ld z dołączanymi bibliotekami, bez bibliotek się tak nie dzieje. Żeby pracować muszę kompilować w gcc


Co robię nie tak?

Offline vanhelzing

  • Users
  • Prawie jak Guru
  • ****
  • Wiadomości: 314
    • Zobacz profil
bash nie widzi pliku, który jest
« Odpowiedź #1 dnia: 2011-06-08, 21:34:50 »
W sumie trudno powiedzieć nie znając kodu, ale gcc dołącza jeszcze crt0, które inicjalizuje środowisko przed wejściem w main. Może spróbuj pójść tym tropem.

Przykład z mana:
ld -o  /lib/crt0.o hello.o -lc

  • Gość
bash nie widzi pliku, który jest
« Odpowiedź #2 dnia: 2011-06-08, 21:52:42 »
Kod:

global main

extern crypt
extern free
extern printf
extern strlen

section .text

main:

;wczytanie
mov eax, 3 ; czytanie z pliku
mov ebx, 0 ; standardowe wejście
mov ecx, tekst
mov edx, tekst_length_max
int 80h

; tworzenie hasha
push sol
push tekst
call crypt
add esp, 8

mov eax, 4
mov ebx, 0
mov ecx, tekst
mov edx, tekst_length_max
int 80h

push wzorzec
call strlen
add esp, 4
mov ebx, eax

push tekst
call strlen
add esp, 4
sub eax, ebx

searching:
mov ecx, eax

loop searching

mov eax, 0
ret


end:
mov eax, 1
xor ebx, ebx
int 80h

section .data
tekst_length_max equ 61
tekst times tekst_length_max db 0
okno times tekst_length_max db 0
wzorzec db "Kot", 0
sol db "AS", 0
adres dd 0
Ale w zasadzie nie powinno od tego zależeć. Bash nie powinien wyświetlać brak pliku, skoro on jest (nawet jeśli byłby niewykonywalny, ale jest i to poprawny)

Offline vanhelzing

  • Users
  • Prawie jak Guru
  • ****
  • Wiadomości: 314
    • Zobacz profil
bash nie widzi pliku, który jest
« Odpowiedź #3 dnia: 2011-06-08, 22:13:15 »
Zanim nie zainicjalizujesz bibliotek i środowiska, to komunikat, jaki wyświetli to kwestia przypadku, bo program pozostawia po sobie śmietnik. Kiedyś miałem podobny problem i to było związane właśnie z uszkodzonym plikiem crt0. Komunikat też był chyba w stylu "Brak pliku", albo równie abstrakcyjny.

Spróbuj skompilować według tego przykładu bez określania punktu wejścia. Według mnie powinno zadziałać tak samo jak kompilacja przez gcc.

Kolejność obiektów i bibliotek też czasami ma znaczenie, więc umieść crt0 na początku listy.