gcc内联汇编程序incbin似乎没有使用-I参数

gcc内联汇编程序incbin似乎没有使用-I参数,gcc,inline-assembly,Gcc,Inline Assembly,我将一个使用gcc 2017.3 eabi none raw metal、针对ARM A7的x86_x64交叉编译、RM编译器构建的项目转换为gcc 2019.3 raw metal Cortex-a编译器。它工作得很好,但遇到了一个奇怪的问题 该项目有一个makefile,它构建了一组小型测试组件,并将其放置在树中: project/test/drivertype1/foo.c project/test/drivertype2/bar.c etc. make工作目录是project/。在fo

我将一个使用gcc 2017.3 eabi none raw metal、针对ARM A7的x86_x64交叉编译、RM编译器构建的项目转换为gcc 2019.3 raw metal Cortex-a编译器。它工作得很好,但遇到了一个奇怪的问题

该项目有一个makefile,它构建了一组小型测试组件,并将其放置在树中:

project/test/drivertype1/foo.c
project/test/drivertype2/bar.c
etc.
make工作目录是project/。在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
我通过将命令从makefile日志中拉出并手动运行来复制它

如果我在运行命令时将工作目录设置为project/like make-does,则错误会再次出现。如果我改为从project/test/drivertype1/运行它,那么它将生成

从project运行时,我尝试指定完整路径,例如-I/home/user/../project/test/drivertype1,但它不起作用。我用相对路径做过其他类似的测试

我的结论是-我不习惯与.incbin一起使用,不像这个人说的那样


建议?

这不是一个正确的答案,而且太大,无法发表评论。这似乎适用于GCC x86和x86-64 Linux目标

在项目目录中,我使用mkdir-p testdir/data创建目录路径testdir/data。然后创建一个名为testdir/data/input.bin的空文件。我在当前目录中创建了一个名为test.C的C程序,该程序包含:

int main()
{
    __asm__ (
        "test_message:\n"
        "    .incbin \"data/input.bin\"\n"
        "test_message_end:"
    );
}
然后我用gcc test.c-o测试来组装它,它会像预期的那样失败。如果我使用gcc test.c-Itestdir/-o test,.incbin指令能够找到文件并成功编译

如果这对你不起作用,那么我只能假设GCC对你的目标有问题;在make文件中有一些问题阻止了-I正确地传递给GCC;或者-I指定的路径与您认为运行GCC的目录无关

AFAIK路径相对于运行GCC的目录,而不是.c文件所在的目录。如果.c文件是project/test/drivertype1/foo.c,并且使用GCC从项目目录编译,那么命令行必须使用-Itest/drivertype1。如果您在项目目录中,类似这样的内容应该可以工作:


是的,gcc-v确认在汇编从C到asm的主cc1编译器的输出时,-I参数被传递到as。@PeterCordes:我怀疑可能发生的情况是,他通过一个目录中的makefile运行gcc来编译另一个目录中的C文件,数据路径与他认为的位置无关。虽然它不能完全解释为什么绝对路径会失败,除非他输入错误。除此之外,GCC中还存在一些特定于某些目标的奇怪错误。工作目录是project,其中C文件位于drivertype1中。我希望我能工作,而且在我更换编译器之前它似乎已经工作了。今天我发现-Wa,-Itest/drivertype1可以工作,我将继续这项工作。
gcc -Itest/drivertype1 test/drivertype1/foo.c