Встроенный ассемблер gcc incbin, похоже, не использует аргумент -I - PullRequest
0 голосов
/ 05 апреля 2019

Я преобразовал проект, который прекрасно работает с gcc 2017.3 eabi-none (raw metal, x86_x64 кросс-компиляция для ARM A7, компилятор RM) в gcc 2019.3 raw metal компилятор Cortex-A.Он работает хорошо, но сталкивается с одной странной проблемой.

В проекте есть make-файл, который строит набор небольших тестовых компонентов, разложенных в дерево:

project/test/drivertype1/foo.c
project/test/drivertype2/bar.c
etc.

Рабочий каталог makeproject/.Внутри foo.c есть некоторые включенные двоичные файлы с помощью директивы inline Assembly .incbin.Данные находятся в подкаталоге:

project/test/drivertype1/data/input.bin

Этот относительный путь разделен.Командная строка имеет -Itest/drivertype1 - левую сторону относительного пути - и исходный код имеет правую сторону:

__asm__ (
    "test_message:\n"
    "    .incbin \"data/input.bin\"\n"
    "test_message_end:"
)

Это приводит к ошибке сборки:

Assembler messages:
22: Error: file not found: data/input.bin

Я воспроизвожу это, вытащив команду из журнала make-файлов и запустив ее вручную.

Если я запускаю команду с рабочим каталогом, установленным в project/, как make, то ошибка воспроизводится.Если я вместо этого запускаю его из project/test/drivertype1/, то он собирается.

При запуске из project я попытался указать полный путь (например, -I/home/user/.../project/test/drivertype1), и он не работает.И я пробовал другие подобные тесты с относительными путями.

Мой вывод таков, что -I не используется с .incbin в отличие от того, что говорит человек.

Предложения?

1 Ответ

1 голос
/ 06 апреля 2019

Это неправильный ответ и слишком большой для комментария.Похоже, это работает с GCC (цели Linux x86 и x86-64).

В каталоге проекта я создаю путь к каталогу testdir/data с mkdir -p testdir/data.Затем я создаю пустой файл с именем testdir/data/input.bin.Я создаю C программу с именем test.c в текущем каталоге, которая содержит:

int main()
{
    __asm__ (
        "test_message:\n"
        "    .incbin \"data/input.bin\"\n"
        "test_message_end:"
    );
}

Затем я собираю ее с gcc test.c -o test, и она завершается с ошибкой, как и ожидалось (как ваша),Если я использую gcc test.c -Itestdir/ -o test, директива .incbin смогла найти файл и успешно скомпилировать.

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


Пути AFAIK относятся к каталогу, из которого запускается GCC, а не к каталогу, в котором находится файл .c.Если ваш .c файл project/test/drivertype1/foo.c и вы компилируете с GCC из каталога project, тогда ваша командная строка должна будет использовать -Itest/drivertype1.Если вы в каталоге project что-то вроде этого должно работать:

gcc -Itest/drivertype1 test/drivertype1/foo.c
...