Сборка минимальной DLL в MinGW? - PullRequest
4 голосов
/ 15 декабря 2011

я пытаюсь скомпилировать dll как можно меньше, я уменьшил выравнивание раздела и сохранил некоторый размер, а также удалил stdlib с (-nostdlib) и включил все оптимизации.теперь у меня есть несколько вопросов

  1. "- Wl, -exclude-all-symbols" удаляет все символы, но оставляет там каталог экспорта, занимая много места
  2. , если я использовалld-скрипт для связывания обоих разделов .data и .text, сделает ли этот раздел .reloc бесполезным?насколько я знаю .reloc используется для абсолютных адресов от .text до .data, если они оба находятся в одном и том же разделе, все адреса будут относительными, верно?

спасибо.

1 Ответ

3 голосов
/ 25 декабря 2011

Не связывайтесь с разделами, просто используйте флаг -fPIC для уменьшения перемещений (в противном случае ссылки на x86 всегда абсолютны). У вас все равно будет .reloc, так как он используется для связи. Кроме того, всегда компилируйте с -Os и -fomit-frame-pointer.

Кстати, у вас не должно быть раздела .data. Если вы делаете это, потому что что-то не так: ищите и исправляйте ваши ссылки на данные; все должно быть постоянным. Если вам нужно связываться с данными, сначала скопируйте их в буфер, предоставленный вызывающей стороной, или что-то в этом роде.

Если вы можете посвятить некоторое время изучению расширения атрибутов GCC, вы найдете несколько атрибутов, которые улучшают понимание кода GCC, тем самым обеспечивая лучшую оптимизацию (например, функции pure и const). Это может сократить много байтов.

Что еще более важно, попробуйте дать GCC основные советы о том, как вы используете код, например, при необходимости используйте static функции.

GCC все равно добавит несколько фиктивных разделов, которые вы можете удалить с помощью утилиты strip. Он не удаляет все по умолчанию, вам нужно указать флаг -s, чтобы удалить все символы, и -R name, чтобы удалить раздел. Вы можете сделать что-то подобное с objcopy -S -R name ... (просто упомянув это, потому что если вы собираетесь делать что-то еще с этим, вы можете сделать все это за один проход).

...