【发布时间】:2018-12-14 04:32:42
【问题描述】:
我有一个汇编文件。我将使用这个文件来包含一个二进制文件,如下所示:
.section .bindata
.global imrdls_start
.type imrdls_start, @object
.global imr_SW_DL_start
.type imr_SW_DL_start, @object
.section .bindata
.balign 64
imrdls_start:
imr_SW_DL_start:
.incbin "file.bin"
.balign 1
imr_SW_DL_end:
.byte 0
然后在 C 文件中,我将调用该变量并使用该二进制文件的内容。
int main(void) {
extern uint8_t imrdls_start;
uint8_t *ptrToExpectedDL = &imrdls_start;
for(int i = 0; i < 135; i++)
{
printf("0x%02x ", ptrToExpectedDL[i]);
if((((i + 1) % 15) == 0)) printf("\n");
}
return EXIT_SUCCESS;
}
问题是,编译执行后,“file.bin”打印出来的内容不正确。
预期的结果是:00 1d 81 ff 00 fe 00 ff 00 1e 82 00 00 20 82 ...
垃圾输出打印为:7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 ...
下面是我的编译器和链接选项:
qcc -Vgcc_ntoaarch64le -c -Wp,-MMD,build/aarch64le-debug/src/imrdls.d,-MT,build/aarch64le-debug/src/imrdls.o -o build/aarch64le-debug/src/imrdls.o -Wall -fmessage-length=0 -g -O0 -fno-builtin src/imrdls.s
qcc -Vgcc_ntoaarch64le -c -Wp,-MMD,build/aarch64le-debug/src/Test.d,-MT,build/aarch64le-debug/src/Test.o -o build/aarch64le-debug/src/Test.o -Wall -fmessage-length=0 -g -O0 -fno-builtin src/Test.c
qcc -Vgcc_ntoaarch64le -o build/aarch64le-debug/Test build/aarch64le-debug/src/Test.o build/aarch64le-debug/src/imrdls.o
任何 cmets 都会非常有帮助。谢谢。
【问题讨论】:
-
您声明了
extern uint8_t imrdls_start;insidemain,而不是全局范围。你试过在外面声明吗?似乎并没有改变 asm 符号名称(godbolt.org/z/aiRMgh),但有点奇怪。此外,您可以将其声明为extern uint8_t imrdls_start[],以便编译器知道它是一个数组对象。 -
你的程序打印什么?它应该打印什么?这不是minimal reproducible example。
-
是的@PeterCordes,我使用了十六进制转储。构建时没有错误或警告。我确定 file.bin 因为如果我将它移到其他地方,它会通知错误没有文件。
-
@PeterCordes 真的很奇怪,我尝试使用 .byte 0x00, 0x1d, 0x81,.. 如你所说。输出值仍然是 7f 45 4c 46 02 01 01...看来我必须对 .bindata 部分做一些事情,比如把它放到 RAM 中,你有什么想法
-
@PeterCordes 我只是研究了.section,你说得对,我们必须记住。我刚想出使用 .rodata 然后我看到你的评论:D。我真的很感谢你的帮助。非常感谢