首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >gcc内联汇编程序incbin似乎没有使用-I参数

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

Stack Overflow用户
提问于 2019-04-05 17:13:53
回答 1查看 1.9K关注 0票数 1

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

该项目有一个makefile,它构建了一组小的测试组件,这些组件被放置在一个树中:

代码语言:javascript
复制
project/test/drivertype1/foo.c
project/test/drivertype2/bar.c
etc.

make工作目录是project/。在foo.c内部,有一些通过内联程序集.incbin指令包含的二进制文件。数据位于子目录中:

代码语言:javascript
复制
project/test/drivertype1/data/input.bin

这个相对路径是分裂的。命令行具有-Itest/drivertype1 (相对路径的左侧),源代码具有右侧:

代码语言:javascript
复制
__asm__ (
    "test_message:\n"
    "    .incbin \"data/input.bin\"\n"
    "test_message_end:"
)

这将导致生成错误:

代码语言:javascript
复制
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一起使用。

有什么建议吗?

EN

回答 1

Stack Overflow用户

发布于 2019-04-05 21:09:54

这不是一个恰当的回答,而且太大了,不能发表评论。这似乎适用于GCC (x86和x866-64linux目标)。

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

代码语言:javascript
复制
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指定的路径与您认为运行的目录不相关。

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

代码语言:javascript
复制
gcc -Itest/drivertype1 test/drivertype1/foo.c
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55540446

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档