default wordsize в UNIX / Linux

Я просматривал предварительно обработанный вывод моей программы на C и wordsize.h файл заголовка wordsize.h

Он находится в /usr/include/i386-linux-gnu/bits/wordsize.h

файл содержит только один макрос

 #define __WORDSIZE 32 

Мой вопрос заключается в том, что словосочетание тогда определяется установленным компилятором или имеет какое-то отношение к установленной мной ОС (32-разрядная или 64-разрядная версия) или имеет какое-то отношение к конфигурации оборудования моего машина.

Я новичок в разработке под Linux.

  • Как изменить имя приложения emacs из «Emacs» на другое в OSX?
  • Может ли загрузочная NetBSD быть построена на OSX?
  • «Mac-стиль» распаковывается на linux
  • Является ли это документированным поведением для BSD Awk или ошибка?
  • rsync --update и symlink не скопировали самую последнюю версию
  • Дарвинский планшет из интерпретатора в исполнении хеш-банга
  • Экспорт логического тома в Mac для использования в качестве привода Time Machine
  • Я не могу ssh на localhost в определенном порту на os x
  • 3 Solutions collect form web for “default wordsize в UNIX / Linux”

    Вообще wordsize при компиляции определяется целевая архитектура. Ваш компилятор обычно компилируется с использованием wordsize для текущей системы.

    Используя gcc (среди прочих), вы также можете настроить это, используя различные флаги. Например, на 64-битном хосте вы можете скомпилировать 32-битную машину или заставить 32-битные слова.

     -m32 # int, long and pointer to 32 bits, generates code for i386. -m64 # int, long and pointer to 64 bits, generates code for x86-64. -mx32 # int, long and pointer to 32 bits, generates code for x86-64. 

    Вы также должны посмотреть на limits.h и inttypes.h чтобы увидеть использование этого определения.


    Для кросс-компиляции проверьте multilib ( 32-разрядная ссылка на SO ) и выполните поиск в Интернете.

    Проверьте, какие флаги были построены GCC:

     gcc -v 

    Что касается размеров, то они обычно тесно связаны с центральным процессором и связаны между собой – например, максимальный размер адреса памяти, размер регистров процессора и т. Д.

    Для быстрого обзора вам не нужно понимать многое из этого, но в зависимости от того, где вы находитесь, это может дать некоторое представление:

    Если вы используете gcc и компилируете с флагом -S вы также можете посмотреть инструкции по сборке . Здесь, немного запутанная, например, 32-битная машина, слово 16 бит и длинное 32-битное. ( __WORDSIZE )

    Так, например, movl $123, %eax означает переместить длинный (32-бит – __WORDSIZE ) 123 в регистр eax , а movw означает перемещение слова (16 бит).


    Это соглашения об именах, и только чтобы сказать, что WORDSIZE может означать более одного. Вы также можете найти код, где они, например, определяют что-то вроде

     #define WORD_SIZE 16 

    поскольку все зависит от контекста. Если вы читаете данные из файла или потока, где источник имеет размер слова 16 бит, это было бы естественно. Только отметить, что не всегда предполагают, что размер слова означает __WORDSIZE когда он читается в коде.


    Пример с пользователем WORD_SIZE не повлияет на набор команд в сгенерированном машинный код. Для GCC вообще я бы рекомендовал эту книгу . (К сожалению, это немного устарело – но еще не найти такую ​​же легкую для чтения более современную книгу. (Не то, чтобы я так сильно смотрелся.) Это короткий, лаконичный и сладкий. И если вы только помните, что вещи могут измениться, например, добавленные функции и т. д., это дает хорошее представление, тем более.)

    Это дает быстрое и приятное введение различных аспектов при компиляции. Взгляните на главу 11, чтобы получить подробное объяснение цепи компиляции.


    Я не знаю никаких вариантов в GCC для компиляции 16-битных. Один из способов сделать это – написать в сборке, используя .code16 чтобы проинструктировать код должен быть 16 бит.

    Пример:

      .file "hello.s" .text .code16 /* Tel GAS to use 16-bit instructions. */ .globl start, _start start: _start: movb $0x48, %al ... 

    Это необходимо, например, загрузчикам, таким как GRUB и LILO, для кода, присутствующего на MBR на вашем жестком диске.

    Причина этого заключается в том, что когда ваш компьютер загружается, процессор находится в специальном режиме, где он не имеет 32-битных, но максимальных 16-разрядных команд AKA Real Mode .

    Короче говоря, происходит то, что BIOS выполняет аппаратный тест, а затем загружает первые 512 байт загрузочного диска в память и оставляет контроль над этим кодом, начиная с адреса 0 . Этот код, в свою очередь, находит, где находится следующий этап файлов, загружает их в память и продолжает выполнение, наконец, войдя в защищенный режим, где у вас нормальный 32-битный режим.

    Вот что мое имеет:

     % cat /usr/include/bits/wordsize.h /* Determine the wordsize from the preprocessor defines. */ #if defined __x86_64__ # define __WORDSIZE 64 # define __WORDSIZE_COMPAT32 1 #else # define __WORDSIZE 32 #endif 

    Таким образом, это определяется wordsize.h , который поставляется вместе с вашим компилятором. Но умный выбирает подходящий размер.

    Вы должны быть в состоянии выбрать словаря по умолчанию во время компиляции, обычно используя один из параметров -m32 или -m64 .

    /usr/include/i386-linux-gnu/bits/wordsize.h предназначен для использования при компиляции 32-битных приложений.

    Должен быть /usr/include/x86_64-linux-gnu/bits/wordsize.h содержащий 64-битное определение __WORDSIZE .

    Это изменение было внесено в Ubuntu 11.4: https://wiki.ubuntu.com/MultiarchSpec

    Если -m64 завершается с ошибкой, у вас может быть 32-разрядное распространение. uname -m скажет вам.

    Хотя можно перекрестно скомпилировать 64-битные бинарные файлы в 32-битной системе, это было бы неудобно, так как у вас не будет простого способа их запуска.

    Если ваш процессор – это 64-разрядная модель (проверьте с помощью lscpu ), вы можете установить 64-разрядный дистрибутив, чтобы иметь возможность легко создавать пакеты с несколькими пакетами.

    Linux и Unix - лучшая ОС в мире.