【发布时间】:2022-01-24 07:46:33
【问题描述】:
我知道这不足以解决堆栈溢出问题,但是 ..
这是u-boot v2021.10的scripts/dtc/libfdt/fdt_ro.c中的一个函数。
const void *fdt_getprop_namelen(const void *fdt, int nodeoffset,
const char *name, int namelen, int *lenp)
{
int poffset;
const struct fdt_property *prop;
printf("uuu0 nodeoffset = 0x%x, name = %s, namelen = %d\n", nodeoffset, name, namelen);
prop = fdt_get_property_namelen_(fdt, nodeoffset, name, namelen, lenp,
&poffset);
//printf("uuu1 prop = 0x%lx, *lenp = 0x%x, poffset = 0x%x\n", prop, *lenp, poffset);
if (!prop)
return NULL;
/* Handle realignment */
if (fdt_chk_version() && fdt_version(fdt) < 0x10 &&
(poffset + sizeof(*prop)) % 8 && fdt32_to_cpu(prop->len) >= 8)
return prop->data + 4;
return prop->data;
}
当我构建程序时,如果我取消注释第二个 printf,编译器会出现段错误。
我不知道。它是纯粹的编译器问题吗(我认为它至少应该永远不会死)?或者它可以与我在另一个代码中的某个地方的错误有关吗?有什么方法可以知道段错误的原因吗? (可能不会。)。
【问题讨论】:
-
您在该 printf 中取消引用
lenp。你确定它指向一个有效的位置,而不是,例如,NULL? -
Chan Kim,试试
printf("prop:%p lenp:%p poffset:%d\n", prop, lenp, poffset);并报告结果。 -
如果编译器本身出现段错误(如您所说),那么这是编译器中的错误。
-
@ChanKim 你能显示编译的逐字错误日志吗?
-
因为它是 u-boot,你可能会踢出超过限制的二进制大小,这可能会使事情发生段错误(我认为链接器脚本可能会检查)。即,您拥有的板子的内部 RAM 有限,用于放置 u-boot。您使代码命中 bss/stack 空间并崩溃。每个人都需要更多的通话背景。您可以提供系统参考(STMxx-dev-board 等)和您使用的 git 代码的链接。 fdt 可能会损坏等。
标签: gcc segmentation-fault arm u-boot device-tree