default wordsize в UNIX / Linux

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

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

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

 #define __WORDSIZE 32 

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

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

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-разрядный дистрибутив, чтобы иметь возможность легко создавать пакеты с несколькими пакетами.

  • Обход пароля пароля ssh из сценария оболочки
  • В Mac OS X Snow Leopard, как можно разрешить разрешения одного файла другому?
  • Почему Mac может монтировать определенное оборудование, которое не может использовать мой Linux Mint?
  • Переключитесь на указанную сеть Wi-Fi через bash на Mac
  • Расписание по загрузочному постоянному обратному туннелю SSH на Mac OSX
  • Запуск dd. Почему ресурс занят?
  • find & sed (поиск и замена)
  • Добавление Echo
  • Что не так с этим вызовом sed -i?
  • Команда sudo service не найдена при установке mongodb
  • Создание каталогов: с разрешениями
  • Interesting Posts

    Как я могу получить уведомление обо всем, что происходит в определенном канале в irssi?

    Запустить сервер удаленно с помощью SSH

    Установите частоту процессора после возобновления?

    Почему экран моей программы тускнеет?

    Будет ли учетная запись заблокирована при входе в режим FTP на удаленный сервер, пароль которого уже истек в UNIX

    Как передать переменные среды в новый сеанс входа в ssh?

    Экран: список Windows в сеансе (неинтерактивный)

    Копирование файлов в bash

    API для IPROUTE2 на любом языке программирования

    Строки из двух разных массивов не совпадают?

    Как заставить MATE запускать команду при запуске сеанса?

    E: Пакет linux-headers-3.5.0-54 необходимо переустановить, но я не могу найти для него архив. «при обновлении системы

    Как настроить дополнительное хранилище EBS на экземпляре Amazon EC2?

    Минимизировать потребность в sudo

    Как установить a .jpg с центром в .pdf (с использованием определенных размеров и границ страницы)?

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