Próbuję skompilować oprogramowanie wewnętrzne dla mojego linksys WRVS4400N.
ls
pokazuje, że istnieje, ale gdy próbuje go uruchomić, bash mówi, że nie istnieje. Mogę to cat
zrobić i jest to plik wykonywalny, a nie skrypt powłoki.
Próbuję skompilować oprogramowanie wewnętrzne dla mojego linksys WRVS4400N.
ls
pokazuje, że istnieje, ale gdy próbuje go uruchomić, bash mówi, że nie istnieje. Mogę to cat
zrobić i jest to plik wykonywalny, a nie skrypt powłoki.
Odpowiedzi:
Wspomniałeś, że wynikiem file mkdep
jest 32-bit elf
. Używasz 64-bitowej maszyny wirtualnej.
Przykład:
$ uname -m
x86_64
$ ls -l ./example
-rwxr-xr-x 1 root root 92312 2011-08-18 16:52 ./example
$ file ./example
example: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.8, stripped
$ ./example
-bash: ./example: No such file or directory
Utwórz nową 32-bitową maszynę wirtualną i tam ją skompiluj.
Czy jest ustawiony na wykonywalność? Jeśli nie, to wtedy chmod +x filename
. Czy to jest w twojej ŚCIEŻCE? Jeśli nie, to nazwij to ./filename
raczej niż po prostu filename
.
Kiedy próbujesz uruchomić plik i bash mówi, że on nie istnieje, czasami oznacza to, że bash wierzy, że plik jest skryptem i że interpreter określony w pierwszym wierszu (#!) Nie istnieje.
Jeśli pliki zostaną nazwane mkdep
, opublikowałbym dane wyjściowe
./mkdep
file mkdep
hd mkdep | head
strace ./mkdep 2>mkdep.strace.txt
Polecenie strace podaje informacje o wykonanych wywołaniach systemowych, na przykład strace ls 2>ls.t
umieszcza następujące polecenie w ls.t
execve ("/ bin / ls", ["ls"], [/ * 22 vars * /]) = 0 brk (0) = 0x8061000 access ("/ etc / ld.so.nohwcap", F_OK) = -1 ENOENT (Brak takiego pliku lub katalogu) mmap2 (NULL, 8192, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0) = 0xb7f82000 access ("/ etc / ld.so.preload", R_OK) = -1 ENOENT (Brak takiego pliku lub katalogu) open ("/ etc / ld.so.cache", O_RDONLY) = 3 fstat64 (3, {st_mode = S_IFREG | 0644, st_size = 32311, ...}) = 0 mmap2 (NULL, 32311, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb7f7a000 close (3) = 0 access ("/ etc / ld.so.nohwcap", F_OK) = -1 ENOENT (Brak takiego pliku lub katalogu) open ("/ lib / librt.so.1", O_RDONLY) = 3 czytaj (3, "\ 177ELF \ 1 \ 1 \ 1 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 3 \ 0 \ 3 \ 0 \ 1 \ 0 \ 0 \ 0 \ 240 \ 30 \ 0 \ 0004 \ 0 \ 0 \ 0 "..., 512) = 512 fstat64 (3, {st_mode = S_IFREG | 0644, st_size = 30624, ...}) = 0
strace ./mkdep 2>mkdep.strace.txt
to dać ci pojęcie o tym, co się dzieje. Być może trzeba zainstalować strace z repozytoriów.
Zmieniasz IFS w swoim skrypcie? Ja też napotkałem ten sam problem w jednym ze swoich skryptów i pomyślałem tak samo (plik 32-bitowy jest odczytywany przez skrypt powłoki na 64-bitowej maszynie). Ale to nie był problem w moim przypadku. Zamiast tego zmieniłem IFS na przecinek i wróciłem do nowej linii, która jakoś pomieszała parser i spowodowała ten błąd.
Właśnie usunąłem wszelkie zmiany w IFS i teraz działa dobrze !!!