Linuxで、エンディアンを報告するシステムコマンドはありますか?


30

システムがビッグエンディアンまたはリトルエンディアンであるかどうかを報告するコマンドを知っていますか、またはPerlまたはコマンドの文字列を使用するこのような手法の最良のオプションですか?

Perl

# little
$ perl -MConfig -e 'print "$Config{byteorder}\n";'
12345678

# big
$ perl -MConfig -e 'print "$Config{byteorder}\n";'
87654321

od | awk

# little
$ echo -n I | od -to2 | awk 'FNR==1{ print substr($2,6,1)}'
1

# big
$ echo -n I | od -to2 | awk 'FNR==1{ print substr($2,6,1)}'
0

参照資料


odメソッドの何が問題になっていますか?シンプルでどこでも動作します。それはあなたの質問の本文を読む前に私が考えたことです。
ジル 'SO-悪であるのをやめる'

@Gilles-ほんとうに、ハックのように感じます(少なくとも私には)。確かに、Solaris + AIXなどの他のシステムで移植可能に見えますが、32ビットと64ビットのように、システムのエンディアンネスをもう少し明確に決定する必要があるように思えたので、そうではなかったことに少し驚きました」 t。新しいlscpu方法は、私が期待するものです。
slm

エンディアンネスは実際にはワードサイズよりも簡単に判断できます。なぜなら、リトルエンディアンでもビッグエンディアンでもないプラットフォームを見つけるのは難しいからです(少なくとも整数の場合、フロートは別の問題です)。 32ビットと64ビットの間(CPU、カーネル、ユーザーランド、特定のプロセス)。
ジル 'SO-悪であるのをやめる'

@Gilles-はい、私は主にSolarisまたはLinuxで育ったため、私の世界観はおそらく軽視されています。それ以上はありません。
slm

このodアプローチは、Linuxだけでなく、ほとんどのオープンシステムで機能するはずlscpuです。そのため、「最良」とは状況に依存します。
MattBianco 14

回答:


40

lscpu

このlscpuコマンドは(とりわけ)を示します。

Byte Order:            Little Endian

これが動作することが知られているシステム

  • CentOS 6
  • Ubuntu(12.04、12.10、13.04、13.10、14.04)
  • Fedora(17、18、19)
  • ArchLinux 2012+
  • Linux Mint Debian(したがって、Debianテストも想定しています)。

動作しないことが知られているシステム

  • Fedora 14
  • CentOS 5(このためRHEL5を想定)

なぜディストリビューション間で明らかな違いがあるのですか?

掘り下げた後、私はその理由を見つけました。バージョンutil-linuxバージョン2.19は、lscpuシステムのエンディアンネスを報告する出力を表示する機能を含む最初のバージョンのようです。

テストとして、Fedora 14システムでバージョン2.18と2.19の両方をコンパイルしました。以下の出力は違いを示しています。

util-linux 2.18

$ util-linux-ng-2.18/sys-utils/lscpu 
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
CPU(s):                4
Thread(s) per core:    2
Core(s) per socket:    2
CPU socket(s):         1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 37
Stepping:              5
CPU MHz:               1199.000
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              3072K
NUMA node0 CPU(s):     0-3

util-linux 2.19

$ util-linux-2.19/sys-utils/lscpu 
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                4
On-line CPU(s) list:   0-3
Thread(s) per core:    2
Core(s) per socket:    2
CPU socket(s):         1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 37
Stepping:              5
CPU MHz:               2667.000
BogoMIPS:              5320.02
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              3072K
NUMA node0 CPU(s):     0-3

上記のバージョンはkernel.orgのWebサイトからダウンロードされました。


デイビッドのおかげで、私はそのファイルをグレープしていたときにそれを見逃しました。盲目になる必要があります8
slm

私はそれを逃した理由を見る。私のFedora 14システムlscpuはその値を表示しませんが、私のUbuntu 12.10システムは表示します。気にしない場合、私はあなたの答えを取り、それを異なるシステムとそれぞれにそれを行う方法のためのセクションに分割するかもしれません。
slm

@slmもちろん、どうぞ。参考のために、lscpuArchlinuxでも動作します。
デビッドバガーマン

Archのどのバージョンですか?
slm

Archにはバージョンがありません。ローリングリリースです...
jasonwryan

6

Debian / Ubuntuシステムで見つけた1つの方法は、次のコマンドを実行することです。

$ dpkg-architecture
DEB_BUILD_ARCH=amd64
DEB_BUILD_ARCH_BITS=64
DEB_BUILD_ARCH_CPU=amd64
DEB_BUILD_ARCH_ENDIAN=little
DEB_BUILD_ARCH_OS=linux
DEB_BUILD_GNU_CPU=x86_64
DEB_BUILD_GNU_SYSTEM=linux-gnu
DEB_BUILD_GNU_TYPE=x86_64-linux-gnu
DEB_BUILD_MULTIARCH=x86_64-linux-gnu
DEB_HOST_ARCH=amd64
DEB_HOST_ARCH_BITS=64
DEB_HOST_ARCH_CPU=amd64
DEB_HOST_ARCH_ENDIAN=little
DEB_HOST_ARCH_OS=linux
DEB_HOST_GNU_CPU=x86_64
DEB_HOST_GNU_SYSTEM=linux-gnu
DEB_HOST_GNU_TYPE=x86_64-linux-gnu
DEB_HOST_MULTIARCH=x86_64-linux-gnu

これにより、システムを構成するアーキテクチャに応じて、ほとんどまたは大きくない単語が表示されます。

$ dpkg-architecture | grep -i end
DEB_BUILD_ARCH_ENDIAN=little
DEB_HOST_ARCH_ENDIAN=little

6

を使用してpython

$ python -c "import sys;print sys.byteorder"
little

または:

printf '\1' | od -dAn
1

どこ1がリトルエンディアンと00256ビッグエンディアンです。

または、より短いperlバージョンを使用します。

$ perl -V:byteorder
byteorder='12345678';

5

POSIX Shell&Cソリューション:

cat << EOF > foo.c

#include <endian.h>
#include <stdio.h>

int main() {
  printf("Byte Order: ");
  if (BYTE_ORDER == LITTLE_ENDIAN) 
    printf("little");
  else {
    if (BYTE_ORDER == BIG_ENDIAN)
      printf("big");
    else
      printf("unknown");
  }
  printf(" endian.\n");
  return 0;
}
EOF

gcc -D__USE_POSIX foo.c
./a.out

1

持っていないシステムを使用している場合endian.h

#include <stdio.h>

int main() {
  int test = 0;
  char *bytes = (char *) &test;
  *bytes = 0x1;

  printf("Byte Order: ");
  if (test == 1){
    printf("little");
  }
  else {
      printf("big");
  }
  printf(" endian.\n");
  return 0;
}

VAXミドルエンディアンが好きではないでしょうか?
-thrig

よくわかりましたが、私は現在のIntel-> PowerPCの問題に夢中になりました。
マシューVキャリー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.