Есть ли какое-либо различие между исполняемыми двоичными файлами между дистрибутивами?

Могу ли я установить итератор на позицию 5 в строке с помощью некоторого члена

Вы можете использовать std :: advance

std::advance(iterator, 5);

или

iterator += 5;

Учитывая итератор, как я могу преобразовать это в числовое смещение в строке?

Вы можете использовать std :: distance

std::distance(string.begin(), iterator);

или

iterator - string.begin()
10
задан Ciro Santilli 新疆改造中心法轮功六四事件 22 May 2015 в 19:12
поделиться

4 ответа

Все дистрибутивы Linux используют один и тот же двоичный формат ELF, но все же есть некоторые различия:

  1. разные В архитектуре ЦП используется другой набор инструкций.
  2. одна и та же архитектура ЦП может использовать другой ABI, ABI определяет, как использовать регистровый файл, как вызывать / возвращать подпрограмму. Различные ABI не могут работать вместе.
  3. Даже на одной арке, на одном и том же ABI, это еще не означает, что мы можем скопировать один двоичный файл из дистрибутива в другой. Поскольку большинство бинарных файлов не связаны статически, они зависят от библиотек в составе дистрибутива, что означает, что в разных дистрибутивах могут использоваться разные версии или разные конфигурации компиляции библиотек.

Итак, если вы хотите, чтобы ваша программа работала во всех дистрибутивах, вам, возможно, придется статически связать версию, которая зависит только от системного вызова ядра, даже в этом случае вы можете запустить только указанную архитектуру.

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

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

Итак, если вы хотите, чтобы ваша программа работала во всех дистрибутивах, вам, возможно, придется статически связать версию, которая зависит только от системного вызова ядра, даже в этом случае вы можете запустить только указанную архитектуру.

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

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

Итак, если вы хотите, чтобы ваша программа работала во всех дистрибутивах, вам, возможно, придется статически связать версию, которая зависит только от системного вызова ядра, даже в этом случае вы можете запустить только указанную архитектуру.

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

14
ответ дан 3 December 2019 в 15:06
поделиться

Все порты Linux (то есть ядро ​​Linux на разных процессорах) используют ELF в качестве формата файла для исполняемых файлов и библиотек. Конкретный двоичный файл ELF помечен одной архитектурой / ОС, на которой он может работать (хотя некоторые ОС имеют совместимость для запуска двоичных файлов ELF из других ОС).

Большинство портов поддерживают более старые a.out формат. (Некоторые процессоры настолько новы, что для них никогда не существовало никаких исполняемых файлов a.out.)

Некоторые порты также поддерживают другие форматы исполняемых файлов; например, порт PA-RISC поддерживает старые исполняемые файлы SOM HP-UX, а порты μcLinux (nonmmu) поддерживают собственный формат FLAT.

Linux также имеет binfmt_misc , который позволяет пользователю регистрировать обработчики для произвольных двоичных форматов. Некоторые дистрибутивы используют это преимущество для выполнения приложений Windows, .NET или Java - на самом деле он все еще запускает интерпретатор, но он полностью прозрачен для пользователя.


Linux on Alpha поддерживает загрузку двоичных файлов Intel, которые выполняются через эмулятор em86 .

Можно зарегистрировать binfmt_misc для исполняемых файлов других архитектур, чтобы запускать их с пользователем qemu .

Теоретически можно было бы создать новый формат - возможно, зарегистрировать новую «архитектуру» в ELF - для толстых двоичных файлов. Затем загрузчик ядра binfmt должен быть обучен этому новому формату, и вы не захотите пропустить динамический компоновщик ld-linux.so и всю цепочку инструментов сборки. Интерес к такой функции был невелик,

13
ответ дан 3 December 2019 в 15:06
поделиться

Почти все программные файлы Linux используют стандарт ELF .

1
ответ дан 3 December 2019 в 15:06
поделиться

Старые Unix-системы также использовали формат COFF . Вы все еще можете найти исполняемые файлы из прошлого в этом формате. Linux по-прежнему поддерживает его (хотя я не знаю, скомпилирован ли он в текущих дистрибутивах).

1
ответ дан 3 December 2019 в 15:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: