Ubuntu Suomen keskustelualueet
Ubuntun käyttö => Ubuntu tietokoneissa => Aiheen aloitti: teele - 09.12.12 - klo:20.53
-
Yritin saada pientä muunnosohjelmaa toimimaan hakemistossa ~/markkinointi, ja alla on tulos.
Onkohan tänään tullut käpisteltyä liikaa, kun en millään ymmärrä, miksi muunnos01 ei käynnisty.
mini@acer:~$ cd markkinointi
mini@acer:~/markkinointi$ ls
ainestietokansio kohdeXXX ktau06.cpp~ ohjeita01.tks~
k40.ods ktau06 muunnos01 oo-temp.csv
k41.ods ktau06.cpp ohjeita01.tks oo-temp.csv~
mini@acer:~/markkinointi$ ./muunnos01
bash: ./muunnos01: Tiedostoa tai hakemistoa ei ole
-
Jos nyt alkuun yrittäisit päättää, etsitkö ohjelmaa ”muunnos”, ”muunnos01” vai ”muunno01”! ;D
Sitten muista panna ./ eteen.
Ja vielä, tarkista, että muunnos01 sisältää #!-rivin.
-
Kiitos vastauksesta, kokeilin vielä kerran ja kopioin sen tuloksen säikeen alkuviestiin.
Yrittäisin siis käynnistää konekielisen eli käännetyn ohjelman muunnos01 komennolla ./muunnos01, mutta joku näyttää menevän pieleen, enkä keksi mikä. Se ehkä selviää listauksesta, mutta omia virheitä on todella vaikea löytää.
teele
-
onko tuo muunnos ajettava tiedosto eli onko x-liput päällä?
chmod +x muunno01
-
Tarkistin sen oikeuden vielä kerran, mutta ei suostu käynnistymään
mini@acer:~$ cd markkinointi
mini@acer:~/markkinointi$ ls
ainestietokansio kohdeXXX ktau06.cpp~ ohjeita01.tks~
k40.ods ktau06 muunnos01 oo-temp.csv
k41.ods ktau06.cpp ohjeita01.tks oo-temp.csv~
mini@acer:~/markkinointi$ chmod +x muunnos01
mini@acer:~/markkinointi$ ./muunnos01
bash: ./muunnos01: Tiedostoa tai hakemistoa ei ole
mini@acer:~/markkinointi$
-
Tarkistin sen oikeuden vielä kerran, mutta ei suostu käynnistymään
bash: ./muunnos01: Tiedostoa tai hakemistoa ei ole
Onko sulla jokin näkymätön merkki (kuten välilyönti) tuon tiedostonimen perässä?
-
Yrittäisin siis käynnistää konekielisen eli käännetyn ohjelman muunnos01 komennolla ./muunnos01, mutta joku näyttää menevän pieleen, enkä keksi mikä. Se ehkä selviää listauksesta, mutta omia virheitä on todella vaikea löytää.
Ahaa, tiedosto ei ole siis skripti vaan binaari. Silloin syy voi olla aika inhottava: jos kaikkia ohjelman tarvitsemia dynaamisesti ladattavia kirjastoja ei löydy, komentotulkki antaa tuon samaisen ilmoituksen. Itse ”muunnos01” siis löytyy mutta jotain sen tarvitsemaa osaa ei löydy.
Kokeile mitä kirjastoja tiedosto tarvitsee komennolla:
ldd muunnos01
-
kirjoita
ls -la
-
Ohjelman ei mielestäni pitäisi tarvita mitään kirjastoja. Se on vain pieni muunnosohjelma lukuarvoille.
Oikeuksissa näyttäisi olevan 3 x:ää muunnos01:ssä. Muutama w puuttuu, mutta sen ei kai pitäisi haitata?
mini@acer:~/markkinointi$ ldd muunnos01
käynnistettävää tiedostoa ei voi ladata dynaamisesti
mini@acer:~/markkinointi$ ls -la
yhteensä 576
drwxrwxr-x 4 mini mini 4096 joulu 9 21:00 .
drwxr-xr-x 51 mini mini 4096 joulu 9 21:42 ..
drwxrwxr-x 2 mini mini 4096 joulu 8 15:44 ainestietokansio
-rw-rw-r-- 1 mini mini 157609 joulu 8 15:48 k40.ods
-rw-rw-r-- 1 mini mini 157728 joulu 9 19:47 k41.ods
drwxrwxr-x 2 mini mini 4096 joulu 8 15:44 kohdeXXX
-rwxrwxr-x 1 mini mini 165230 joulu 9 17:37 ktau06
-rwxrwxr-x 1 mini mini 24988 joulu 9 17:38 ktau06.cpp
-rw-rw-r-- 1 mini mini 24956 joulu 9 17:37 ktau06.cpp~
-rwxr-xr-x 1 mini mini 12098 tammi 27 2012 muunnos01
-rw-rw-r-- 1 mini mini 1733 joulu 8 11:03 ohjeita01.tks
-rw-rw-r-- 1 mini mini 1733 joulu 8 10:53 ohjeita01.tks~
-rw-rw-r-- 1 mini mini 3011 joulu 9 20:35 oo-temp.csv
-rw-rw-r-- 1 mini mini 3011 joulu 9 17:35 oo-temp.csv~
mini@acer:~/markkinointi$
-
Ohjelman ei mielestäni pitäisi tarvita mitään kirjastoja. Se on vain pieni muunnosohjelma lukuarvoille.
Ei valitettavasti todista mitään. Nykyiset kääntäjät tuppaavat joko tekemään valtavan isoja binaareja tai käyttämään dynaamisia kirjastoja. ”muunnos01” näyttää olevan 12 kt kokoinen, joten se voi hyvin olla koostettu niin, että tarvittavat komponentit eivät ole mukana.
Muoks: Tässä vielä esimerkki. Pieni keskiarvon laskeva ohjelma:
/* Keskiarvon laskenta, c */
#include <stdio.h>
int main(void)
{
double luku = 1.0, summa = 0.0, keskiarvo;
int lkm = 0;
for (; luku; summa += luku, lkm ++) {
printf("Anna luku, 0 lopettaa: ");
scanf("%lf", &luku);
}
keskiarvo = summa / -- lkm;
printf("Keskiarvo = %lf\n", keskiarvo);
return(0);
}
Ja tässä ldd:n tuloste sen käännetystä versiosta:
tn@bahtin [Tommi/Ohjelmointi/Keskiarvot]$ ldd keskiarvo
linux-vdso.so.1 => (0x00007fffe7848000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f17ff615000)
/lib64/ld-linux-x86-64.so.2 (0x00007f17ff9f7000)
-
"cannot dynamically load executable"
Tuossa nyt herää aika monta kysymystä (ja otsikkokin lienee väärä), onko tuo jokin itse tehty ohjelma jonka olet kääntänyt koneellasi vai ihan muualta koneellesi kannettu ohjelma ? Ensimmäisessä tapauksessa varmaan jokin käännösvirhe, toisessa tapauksessa tuo ei ole binääriyhteensopiva...
Mitä kertovat:
uname -m
file muunnos01
-
Tosiaan, ehkä käännöksellä on jotain tekemistä ongelman kanssa. Koska nykyinen käyttisversio u12.04, olen varmaan kääntänyt ohjelman u10.04 -versiolla, joka oli muistaakseni 32-bittinen.
Luulin, että 64 osaa ajaa 32-ohjelmia suoraan. Ohjelma näyttäisi toimivan, kun sen kääntää uudestaan. Mutta en ole vielä siirtänyt käännettyä versiota samaan kokeiluhakemistoon. Yksi ajatus oli, että alkuperäisen ongelmaohjelman kopioinnissa olisi tapahtunut jokin virhe tai oikeudet olisivat jotenkin muuttuneet.
Jos joku osaa sanoa esim. alla olevan listauksen perusteella, että vika on vanhassa käännöksessä, voisin varmaan laittaa aiheen ratkaistuksi.
mini@acer:~$ uname -m
x86_64
mini@acer:~$ cd markkinointi
mini@acer:~/markkinointi$ file muunnos01
muunnos01: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, BuildID[sha1]=0x1d91c93bee138d8092061cb7d44daf369d351d14, not stripped
mini@acer:~/markkinointi$
-
Luulin, että 64 osaa ajaa 32-ohjelmia suoraan.
Ainoastaan, jos 32-bittiset kirjastot on asennettu, koska kuten sanoin, noinkin pieni ohjelma KÄYTTÄÄ kirjastoja ;)