Не связывайтесь с разделами, просто используйте флаг -fPIC
для уменьшения перемещений (в противном случае ссылки на x86 всегда абсолютны). У вас все равно будет .reloc
, так как он используется для связи. Кроме того, всегда компилируйте с -Os
и -fomit-frame-pointer
.
Кстати, у вас не должно быть раздела .data
. Если вы делаете это, потому что что-то не так: ищите и исправляйте ваши ссылки на данные; все должно быть постоянным. Если вам нужно связываться с данными, сначала скопируйте их в буфер, предоставленный вызывающей стороной, или что-то в этом роде.
Если вы можете посвятить некоторое время изучению расширения атрибутов GCC, вы найдете несколько атрибутов, которые улучшают понимание кода GCC, тем самым обеспечивая лучшую оптимизацию (например, функции pure
и const
). Это может сократить много байтов.
Что еще более важно, попробуйте дать GCC основные советы о том, как вы используете код, например, при необходимости используйте static
функции.
GCC все равно добавит несколько фиктивных разделов, которые вы можете удалить с помощью утилиты strip
. Он не удаляет все по умолчанию, вам нужно указать флаг -s
, чтобы удалить все символы, и -R name
, чтобы удалить раздел. Вы можете сделать что-то подобное с objcopy -S -R name ...
(просто упомянув это, потому что если вы собираетесь делать что-то еще с этим, вы можете сделать все это за один проход).