Nano Hash - криптовалюты, майнинг, программирование

Почему эта тривиальная программа такая большая при компиляции?

Я создал файл, содержащий следующую строку:

int main() { return 0; }

После компиляции я с удивлением обнаружил, что бинарник этой простой программы составляет 8328 байт! Что здесь происходит и что делает двоичный файл в этих 8328 байтах? Наверняка эта программа может быть выражена всего в нескольких строчках ассемблера.

Примечание. Я скомпилировал это со следующей строкой:

g++ main.cpp

Моя версия g++ g++ (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1

30.07.2012

  • Для какой платформы компилируете? т.е. Винда, линукс? 30.07.2012
  • muppetlabs.com/~breadbox/software/tiny/teensy.html 30.07.2012
  • @ Мэтью, я на Linux. В частности, 64-битная Ubuntu. 30.07.2012
  • @ikh и Дэниел А. Уайт - я обновил вопрос, надеюсь, он ответил на ваши вопросы. 30.07.2012
  • Наверняка эта программа может быть выражена всего в нескольких строчках ассемблера. - Ты забываешь вещи cr0.o... 30.07.2012
  • @Гривес, нет, я просто ничего не знаю о cr0.o. Хочешь просветить меня? 30.07.2012
  • @CoryKlein, это то, что Ларсманс назвал стартовым кодом. 30.07.2012
  • Вы называете 8K большим? привет мир 500К на MinGW ;) 30.07.2012
  • Я знаю, что опоздал на неделю, но этот вопрос напомнил мне аналогичный вопрос о переполнении стека (хотя и с точки зрения Windows) что-это-самый-маленький-возможный-windows-pe-executable Что указывает на эту статью: Tiny PE, который утверждает, что 97 байт является наименьшим возможным PE. Учебное пособие Whirlwind по созданию очень маленьких исполняемых файлов ELF для Linux](mupp 05.08.2012

Ответы:


1

В этом бинарнике много:

  • заголовок, чтобы сделать двоичный файл самоописываемым (попробуйте запустить для него file)
  • таблица символов, которую инструмент strip удалит для вас (или свяжите с gcc -s)
  • имена и расположение разделяемых библиотек, которые вы никогда не используете (пять из них в моем ящике; попробуйте инструменты ldd и strings)
  • код запуска, который загружает эти библиотеки и устанавливает argc и argv, а затем вызывает main
  • код выключения, который возвращает возвращаемое значение main в операционную систему.

Для комического эффекта попробуйте связать эту программу статически, тогда ваш двоичный файл будет включать функции, которые обычно динамически связываются с DLL. (однако этот вариант упростит развертывание)

30.07.2012

2

Сделайте бинарный дамп полученного файла и проверьте его!

В основном это пустое пространство. Данные в двоичном формате организованы в страницы (обычно размером 4096 или 8192 байта). Таким образом страницы могут быть эффективно отображены в память. Обычно первая страница содержит инструкции о том, как загрузить двоичный файл — код находится в этом месте файла и отображается в этом месте, то же самое для данных и т. д. Вторая страница, вероятно, будет вашим кодом, а третья страница будет содержать символы и отладочная информация. Каждая страница, вероятно, в основном пуста.

30.07.2012
  • Хм, очень интересно. Я посмотрел его с помощью шестнадцатеричного редактора, и там есть один пустой раздел, но он состоит только из 46% файла. 30.07.2012

  • 3

    Не беспокойтесь.

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

    Кратко: есть часть стандартной библиотеки, которая составляет «инфраструктуру» между модулями ОС и семантикой C++, которая управляет запуском и завершением программы (все, что инициализирует и уничтожает глобальные переменные, стандартный ввод и вывод и т. д.)

    Плюс: все, что сопоставляет символы C++ с адресами памяти (если вам не требовалось удалять это, попробуйте -O3 -s и исключите параметры -g), чтобы отладчик мог показать правильный источник ссылки на код во время выполнения.

    Также: из-за того, как организована память, двоичный файл обычно состоит из фрагментов фиксированного размера. Ваша программа может быть даже короче, но должны присутствовать по крайней мере один сегмент кода, один инициализатор сегмента данных и один общий сегмент (для постоянных значений).

    30.07.2012
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..