gcc内联汇编器incbin似乎不使用-I参数

时间:2019-04-05 17:13:54

标签: gcc inline-assembly

我将使用gcc 2017.3 eabi-none(原始金属,用于ARM A7的x86_x64交叉编译,RM编译器)构建良好的项目转换为gcc 2019.3原始金属Cortex-A编译器。它运作良好,但遇到一个奇怪的问题。

该项目有一个生成文件,该文件构建了一组小的测试组件,并被放置在树中:

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

make工作目录为project/。在foo.c内部,通过内联汇编.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日志中拉出命令并手动运行它来重现该命令。

如果像make一样在工作目录设置为project/的情况下运行命令,则会重现该错误。如果我改为从project/test/drivertype1/运行它,那么它将构建。

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

我的结论是-I.incbin一起使用的方式与该人所说的不同。

建议?

1 个答案:

答案 0 :(得分:1)

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

在项目目录中,我用testdir/data创建目录路径mkdir -p 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 test组合在一起,并且它按预期失败(您的方式)。如果我使用gcc test.c -Itestdir/ -o test,则.incbin指令可以找到文件并成功编译。

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


AFAIK路径是相对于运行GCC的目录的,而不是相对于.c文件所在的目录的。如果您的.c文件是project/test/drivertype1/foo.c,并且您从project目录使用GCC进行了编译,则您的命令行将必须使用-Itest/drivertype1。如果您位于project目录中的 中,则类似 这样的目录应该起作用:

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