Исполняемый файл, созданный Clang, составляет 94% нулевых байтов, как его уменьшить?

Я скомпилировал свой проект со следующими флагами: clang -MMD -MP -D_FORTIFY_SOURCE=2 -Weverything -Wno-poison-system-directories -O2 -fPIE -fPIC -fstack-protector -finline-functions -march=native -mtune=native src/getargv.c -o bin/getargv, который создал исполняемый файл размером 49 КБ (50224Б) и 96% (47799Б) байтов NULL, по данным xxd -p -c 1 < bin/getargv | sort | uniq -c и ls -l bin/getargv.

llvm-size --format=darwin bin/getargv говорит:

Segment __PAGEZERO: 4294967296
Segment __TEXT: 16384
    Section __text: 1220
    Section __stubs: 78
    Section __stub_helper: 146
    Section __cstring: 41
    Section __unwind_info: 96
    total 1581
Segment __DATA_CONST: 16384
    Section __got: 32
    total 32
Segment __DATA: 16384
    Section __la_symbol_ptr: 104
    Section __data: 8
    Section __bss: 8
    total 120
Segment __LINKEDIT: 1072
total 4295017520

Таким образом, исполняемый файл - это байты 3*16384+1072=50224 на диске (соответствует ls -l), но в файле afaict есть только байты данных 1581+32+120+1072=2805 (94% пусто, что довольно близко к 96% выше, я предполагаю некоторые заполнители и нулевые байты в данных и т. д. ).

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

Есть ли способ уменьшить размер сегмента? Или лучше убрать исполняемый файл?

[Редактировать]

$ du -h bin/getargv 
 52K    bin/getargv

пропустите его через сжатие lz, чтобы увидеть энтропию. если он сократится до ~ 3k / 4k, вы будете уверены, что все равно нулю. Если нет, то его просто нет в списке.

v.oddou 30.03.2021 09:21

Проверил с xxd, нули.

Camden Narzt 30.03.2021 09:21

Самый простой способ уменьшить размер - использовать Linux;) Похоже, компоновщик делает что-то действительно наполовину и не чередует сегменты в файле, как это стандартно для Gnu LD?

Antti Haapala 30.03.2021 09:33

К сожалению, linux не подходит для этой программы, он существует, чтобы предоставить только sysctl для macOS, чтобы восполнить отсутствие /proc/<pid>/cmdline.

Camden Narzt 30.03.2021 09:36

Вы уверены, что он действительно занимает так много места на диске? Дисковые блоки с нулевыми значениями обычно оптимизируются. Используйте du -h bin/getargv, чтобы узнать, сколько места он фактически использует.

Barmar 30.03.2021 09:41

Обновленный вопрос с выводом du.

Camden Narzt 30.03.2021 09:46

Разве сегменты Mach-O не требуют выравнивания страницы (16k в этой системе)? Если так, то я не думаю, что вы сможете выиграть, не потеряв ни одного сегмента… Это GOT в __DATA_CONST должно быть заманчиво для таргетинга, насколько вы привязаны к PIC / PIE?

James Greenhalgh 30.03.2021 09:54

Что дает вам уверенность в том, что есть блоки нулей побольше? Вы заглянули в двоичный файл? Могут быть всевозможные значения, превышающие 8-битные, с одиночными нулями, в дополнение к кодам операций, которые содержат нули.

the busybee 30.03.2021 12:01

@thebusybee да, я посмотрел на шестнадцатеричный вывод, там огромные серии всего по 00 байт.

Camden Narzt 30.03.2021 18:51

@JamesGreenhalgh, это интересно, я бы подумал, что сегменты будут просто загружаться в ОЗУ при соответствующем выравнивании, а не храниться на диске таким образом.

Camden Narzt 30.03.2021 19:00

Отвечает ли это на ваш вопрос? Почему не оптимизированы байты заполнения в исполняемых файлах?

Siguza 30.03.2021 21:50

Может также увидеть это: stackoverflow.com/a/65449833

Siguza 30.03.2021 21:52

Отвечает ли это на ваш вопрос? Почему мой двоичный файл hello world в основном нули?

the busybee 30.03.2021 21:52

@Siguza Я думаю, что второе.

the busybee 30.03.2021 21:53

Busybee и Siguza - да, эти ссылки хорошо это объясняют и даже дают мне возможность немного уменьшить размер исполняемого файла. Вы можете пометить это как дублирование или что-то еще, если хотите.

Camden Narzt 31.03.2021 00:26
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
15
84
0

Другие вопросы по теме