Чи є системна команда в Linux, яка повідомляє про небезпеку?


30

Хтось знає про команду, яка повідомляє, чи є система Big Endian або Little Endian, чи найкращий варіант такої техніки, як Perl або рядок команд?

Perl

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

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

од | 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, але здавалося, що Endianness системи має бути дещо чіткіше визначеним, як 32-бітне порівняно з 64-бітним, тому я трохи здивований, що це не було ' т. Новіший lscpuметод - це те, чого я б очікував.
slm

На практиці визначити ендіантність простіше, ніж розмір слова, тому що вам буде важко знайти платформи, які не є ні мало-ендіанськими, ні великими-ендіанськими (принаймні для цілих чисел, поплавці - інша справа), тоді як міксів багато між 32-бітними і 64-бітовими (процесор, ядро, користувальницька область, заданий процес).
Жил 'SO- перестань бути злим'

@Gilles - так, мій погляд на світ, мабуть, ослаблений, оскільки я в першу чергу ріс із Solaris чи Linux. Не так вже й багато іншого.
slm

odпідхід повинен працювати на більшості відкритих систем, не тільки Linux, яка була б у випадку з допомогою lscpu. Тож те, що "найкраще", залежить від обставин.
MattBianco

Відповіді:


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відображається вихідний звіт про систему Endianness вашої системи.

У якості тесту я зібрав і версії 2.18, і 2.19 у своїй системі Fedora 14, а вихідний результат показує відмінності:

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 .


Дякую, Девіде, я пропустив це, коли схвалював цей файл. Повинно бути сліпим 8-)
slm

Я бачу, чому я пропустив це. Мої системи Fedora 14 lscpuне показують цього значення, однак моя система Ubuntu 12.10. Якщо ви не заперечуєте, я можу взяти вашу відповідь і розділити її на розділи для різних систем і способи зробити це на кожній.
slm

@slm Звичайно, йти вперед. Для довідки, lscpuпрацює і Archlinux.
Девід Баггерман

Яка версія Arch?
slm

Arch не має версій; це прокатний реліз ...
jasonwryan

6

Один із методів, які я знайшов у системах Debian / Ubuntu, - це запустити цю команду:

$ 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 середнього рівня?
триг

Добре помічений, я був настільки захоплений моїми поточними проблемами Intel-> PowerPC, що я не задумав чогось такого жахливого.
Меттью V Кері
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.