Ответ 1
pahole - это утилита, написанная для этой конкретной цели. Он проанализирует ваши скомпилированные объектные файлы (скомпилированные с включенной отладкой) и покажет вам структурные дыры.
Справочная информация. Компилятор может вставлять дополнения в структуру, чтобы улучшить соответствие элементов. Это приведет к тому, что размер структуры будет больше, чем сумма его членов. Переупорядочивание элементов структуры, чтобы они лучше упаковывали, может устранить необходимость компиляции для этого способом и сделать структуру меньшим сберегающей памятью. Мне нужно получить экономию памяти.
Резервный вариант - проверить каждую структуру вручную. Я ищу автоматический подход, который может сократить усилия.
Даже если это уменьшает количество проверяемых структур вручную, которые помогут.
Так, например, процесс/инструмент/etc, который перечисляет все структуры, которые больше, чем сумма размеров их членов, хотя и не идеальный, будет по-прежнему полезен, поскольку он ограничивает те, которые необходимо вручную проверять.
Кто-нибудь знает какие-либо инструменты, которые могут это сделать, или кто-нибудь может предложить какие-либо подходы, которые могут помочь.
p.s. Мне нужно сделать это на встроенной C-кодовой базе, содержащей более 1 миллиона строк кода.
pahole - это утилита, написанная для этой конкретной цели. Он проанализирует ваши скомпилированные объектные файлы (скомпилированные с включенной отладкой) и покажет вам структурные дыры.
Опция gcc -Wpadded warning может использоваться для указания вам, когда структура дополняется. Это не скажет вам, когда структура может быть уменьшена, но это может помочь уменьшить работу.
Вы можете написать программу, которая, в свою очередь, выписывает небольшую программу на C для каждой перестановки полей в структуре, а также когда компилируется выходная программа и запускает ее распечатку размера структуры. Это станет непрактичным, если количество полей станет намного больше 10 или около того.
CIL - это надежный C-парсер, написанный в OCaml, который понимает заполнение структур. Он поставляется с программой обнаружения C. Наложение структуры зависит от платформы, я не сомневаюсь, что вы это знаете, но вы могли бы уточнить свой вопрос. Программа обнаружения, упакованная с помощью CIL, определяет размер типов, и алгоритм, который использует CIL, используется для заполнения структур, заключается в том, что смещение n-го поля вычисляется путем округления (смещение (n-1) -ного поля + размер (n-1) -го поля) до ближайшего кратного (выравнивание n-го поля).
Было бы менее 200 строк OCaml, чтобы сделать необходимый вам инструмент, начиная с CIL. Но пока могут быть лучшие решения.