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

问题描述 投票:0回答:1

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

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

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日志中拉出命令并手动运行来重现这一点。

如果我运行命令,将工作目录设置为project/,如make do,则错误再现。如果我从project/test/drivertype1/运行它,那么它构建。

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

我的结论是-I.incbin不同,不像男人所说的那样。

建议?

gcc inline-assembly
1个回答
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
© www.soinside.com 2019 - 2024. All rights reserved.