Как я разделяю локальные символы от модуля ядра Linux, не повреждая его?

Если я делаю --strip-debug или --strip-unneeded, Я имею .ko это перечисляет все имена функций с nm, если я делаю просто strip foo.ko У меня есть модуль ядра, который отказывается загружаться.

Кто-либо знает быстрый ярлык, как удалить все символы, которые не нужны для загрузки модуля так, чтобы люди не могли перепроектировать API:s как легко?

PS: Для всего Вы миссионеры фанатиков с открытым исходным кодом; это - что-то, что широкая публика никогда не будет использовать в любом случае так никакая потребность превратить вопрос в войну пламени GPL.

7
задан Kimvais 24 May 2010 в 10:23
поделиться

3 ответа

Не получив ответа на мои предыдущие вопросы, вот несколько предположений, которые также могут быть некоторыми подсказками и шагом к ответу:

Насколько я помню, .ko - это не что иное, как .o файл, полученный в результате слияния всех .o файлов, созданных вашим исходным модулем, и добавления секции .modinfo. В конце любого Makefile, создающего .ko, есть вызов LD: насколько я помню, ld вызывается с опцией -r, и именно он создает тот .o файл, который Makefile называет .ko. Этот результирующий файл не следует путать с архивом или библиотекой объектов (файл .a), это просто формат архивирования / упаковки нескольких .o файлов как одного: Объединенный объект - это результат соединения, в результате которого получается еще один модуль .o: Но в результирующем модуле все секции, которые могли быть объединены, были объединены, и все пары public / external, которые могли быть разрешены, были внутри этих секций. Поэтому я предполагаю, что в итоге вы получите файл .ko, содержащий все ваши "локальные" внешние определения:

  • Те, которые являются внешними, потому что они используются для вызова всех .o модулей в вашем .ko (но не являются больше не нужны, поскольку они не не должны вызываться извне .ko), и

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

Первые, скорее всего, уже были решены ld во время слияния, но у ld нет возможности узнать, собираетесь ли вы также вызывать их извне .ko.

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

Правильно ли в последнем абзаце описаны символы, от которых вы хотите избавиться?

7
ответ дан 6 December 2019 в 07:25
поделиться

Я не уверен, что понимаю, в чем проблема на самом деле: При разработке .ko, если я явно не добавлю что-то вроде

ccflags-y += -ggdb -O0 -Wall

в свой Makefile, я не получу никаких символов, кроме тех, которые я публикую или внешний ref сам. Я уверен, что не получаю никаких других символов по нескольким веским причинам:

  • результирующий файл .ko значительно меньше,
  • сброс файла и анализ ELF показывает, что таблиц там нет,
  • Я не вижу и не могу получить доступ к символам в kgdb.

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

3
ответ дан 6 December 2019 в 07:25
поделиться

Я думаю, что это именно то, о чем мы именно об этом мы здесь говорим.

Хорошо, тогда, похоже, одним из решений является "ручное" удаление лишних символов. Утилита "strip", похоже, позволяет удалять (или сохранять) символы по отдельности, так что вам придется использовать один --strip-all и небольшую кучку --keep-symbol= . Обратите внимание, что --wildcard тоже может немного помочь. Можно, конечно, сделать и наоборот, сохранить все и раздельно разделить, в зависимости от того, что удобнее.

Хорошим началом может быть удаление всех символов, которые вы явно определили в вашем модуле для кросс-модульного связывания и не хотите, чтобы они появлялись - оставив только очевидные полезные, такие как init и exit. И не трогать те, которые были сгенерированы / принадлежат программной инфраструктуре разработки ядра. Затем методом проб и ошибок, пока не найдете правильный рецепт... На самом деле, я думаю, что примерно все ваши собственные символы могут быть удалены, кроме тех, которые вы явно определили как EXPORT_SYMBOL (и init / exit, конечно).

Удачи! :)

PS:

На самом деле, похоже, что необходимая исходная информация существует во всех проектах .ko для автоматического выполнения требуемой зачистки: Если я ничего не упустил, кажется, что все, что не является EXPORT_SYMBOL или явно вставлено программой сборки, теоретически может быть удалено по умолчанию в конце времени "ld -r", завершающего сборку .ko. Просто я не думаю, что цепочка инструментов (компилятор / компоновщик) имеет положение / директивы / опции для индивидуального указания "зачищать или сохранять" симсы для перемещаемой связи / слияния. В противном случае, некоторые изменения в макросе EXPORT_SYMBOL и в некоторых других местах, вероятно, могли бы достичь результата, который вы хотите, и сэкономить несколько байт из большинства .ko файлов в любой Linux системе.

6
ответ дан 6 December 2019 в 07:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: