Проблемы с соединением при добавлении S-файла в ядро ​​Linux - PullRequest
3 голосов
/ 26 ноября 2010

После ответа на предыдущий вопрос: Добавление файла .S в код ядра Linux Мне удалось добавить файл .S в файлы сборки ядра Linux. Тем не менее, мой файл .S содержит несколько разделов, которые заменяют функции, написанные на C. Я закомментировал эти функции и объявил функции замены глобальными, но при попытке связать ядро ​​(используя make) я получаю следующую ошибку:

arch/x86/kernel/vmlinux.lds:XXX: non constant or forward reference address expression for section .YYY

Исходные функции, которые я заменил, были объявлены с использованием: __attribute__ ((unused, __section__("YYY"))) notrace

Разделы asm объявляются с использованием:

.text
.globl YYY

Я также попытался добавить:

.type YYY,@function

Возможно, я где-то пропустил какое-то объявление, но я не уверен, где искать.

Есть идеи?

Ответы [ 2 ]

2 голосов
/ 26 ноября 2010

Если вы хотите поместить функции сборки в секцию YYY, а не .text, вам необходимо заменить

.text

на

.section YYY,"ax"
1 голос
/ 27 ноября 2010

Этот код:

.text
.globl YYY

говорит ассемблеру, что вы собираетесь писать что-то в разделе «текст», и что «YYY» является глобальным в этом разделе. Ваш .type добавляет, что «YYY» - это имя функции. Это не то, что вам нужно: вы хотите, чтобы секция называлась «YYY», а не сама функция. Чтобы выбрать раздел с определенным именем, используйте директиву .section (.text - это просто сокращение для .section, которое обозначает раздел «текст»).

...