[LUGOS] uname, "laganje o arhitekturi" in kako izvedeti pravo arhitekturo

Mojca Miklavec mojca.miklavec.lists at gmail.com
Thu Nov 19 09:28:19 CET 2009


Živijo,

skrbim za distribucijo programov za več arhitektur. Z bash skripto (z
ukazom "uname") ugotavljam arhitekturo sistema in na podlagi tega s
spleta pretočim prave binarne datoteke. To deluje v 99% primerov,
razen:
- na bivšem strežniku (mislim, da je bil nek virtualen sistem) smo
imeli dolgo časa težave, saj je "uname -m" vračal "x86_64", sam sistem
pa ni podpiral poganjanja 64-bitnih programov (uname bi moral vračati
i386). To je bil osamljen primer.
- Mac OS X 10.6 privzeto vrača "i386", vendar na 64-bitnih procesorjih
deluje v 64-bitnem načinu in gcc pretvarja izvorno kodo v 64-bitne
programe. To je zelo razširjen problem.

Ali je mogoče zanesljivo izvedeti arhitekturo na kakšen drugačen način?

Recimo, da poženem program moja_arhitektura (ki sem ga sama napisala
in prevedla) in me zanima, za kakšno arhitekturo je preveden. Obstaja
kakšen način, da mi program to sam pove? Kako? Program seveda lahko
izvede ukaz "uname -m", vendar mi to ne pomaga, saj lahko na 64-bitnem
intelu brez težav prevajam programe za PowerPC in jih poganjam, pri
čemer bi si želela, da bi mi program znal odgovoriti, za katero
platformo je preveden.

Primer zanesljivega ukaza na Mac-u je npr.
    > file moja_arhitektura
ki vrne enega od spodnjih odgovorov:
    moja_arhitektura: Mach-O executable i386
    moja_arhitektura: Mach-O 64-bit executable x86_64
    moja_arhitektura: Mach-O executable ppc
Kako bi mi lahko program to povedal sam o sebi in na ostalih
operacijskih sistemih?

(Spodaj je koda, ki jo trenutno uporabljam za prepoznavanje
arhitektur, a ni 100% zanesljiva.)

Hvala,
    Mojca

system=`uname -s`
cpu=`uname -m`

case "$system" in
  # linux
  Linux)
    case "$cpu" in
      i*86) platform="linux" ;;
      x86_64|ia64) platform="linux-64" ;;
      ppc) platform="linux-ppc" ;;
      *) platform="unknown" ;;
    esac ;;
  # Mac OS X
  Darwin)
    case "$cpu" in
      i*86) platform="osx-intel" ;;
      x86_64) platform="osx-64" ;;
      ppc*|powerpc|power*|Power*) platform="osx-ppc" ;;
      *) platform="unknown" ;;
    esac ;;
  # FreeBSD
  FreeBSD|freebsd)
    case "$cpu" in
      i*86) platform="freebsd" ;;
      x86_64) platform="freebsd" ;;
      amd64) platform="freebsd-64" ;;
      *) platform="unknown" ;;
    esac ;;
...


More information about the lugos-list mailing list