Размещение кода и данных в одном разделе модуля ядра Linux - PullRequest
1 голос
/ 19 марта 2009

Я пишу модуль ядра Linux, в котором я хотел бы иметь некоторый код и связанные данные в одном разделе. Я объявляю данные и функции тегами атрибутов, например:

void * foo __attribute__ ((section ("SEC_A"))) = NULL;
void bar(void)  __attribute__ ((section("SEC_A")));

Однако, когда я делаю это, gcc жалуется:

error: foo causes a section type conflict

Если я не объявляю функцию с определенным именем раздела, gcc вполне подойдет. Но я хочу, чтобы и функция, и переменная находились в одном и том же разделе.

Есть ли способ сделать это с помощью gcc? Моя версия gcc gcc (Ubuntu 4.3.2-1ubuntu12) 4.3.2

Ответы [ 2 ]

1 голос
/ 19 марта 2009

Из руководства GCC:

Некоторые форматы файлов не поддерживают произвольные разделы, поэтому атрибут раздела доступен не на всех платформах. Если вам необходимо сопоставить все содержимое модуля с определенным разделом, рассмотрите возможность использования средств компоновщика.

IIRC, в linux используется модель с плоской памятью, так что вы ничего не получите, «в любом случае», «втиснув» вещи в один раздел, не так ли?

Хм. Я полагаю, вы могли бы сделать функцию asm, чтобы зарезервировать пространство, а затем сделать указатель foo, чтобы получить его адрес. Может быть, хочу обернуть уродливые в макрос ...

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

Еще одна мысль: попробуйте поместить определения переменных в небольшой модуль asm (e, g, как db или любой другой с правильными объявлениями раздела) и позвольте компоновщику обработать его.

0 голосов
/ 19 марта 2009

Я думаю, вы не можете поместить объекты текста (функции) и данных (BSS) в один и тот же раздел, потому что (некоторые) ОС предполагают неизменность типов разделов .TEXT для повторного использования процесса.

...