C语言 数组变量没有得到分配在一个数据节时,我给节属性,为什么?

5hcedyr0  于 2023-08-03  发布在  其他
关注(0)|答案(2)|浏览(126)

我添加了指定某些数据部分的属性(在任何函数之外,因此它在一种数据部分中),如下所示。

char __attribute__(( aligned(256), __section__(".axpudata") )) mem_local  [N_AXEMIS_PER_AXPU][LOCAL_SEGMENT_SIZE];
char __attribute__(( aligned(256), __section__(".axpudata") )) mem_private[N_AXEMIS_PER_AXPU][N_AXEC_PER_AXEMIS*N_THREAD_PER_AXEC][PRIVATE_SEGMENT_SIZE];
uint64_t  __attribute__(( aligned(256), __section__(".axpudata") )) mem_knlargs[KNLARGS_SEGMENT_SIZE/8];
struct __attribute__(( aligned(256), __section__(".axpudata") )) es_t      axpu_es   [N_AXEMIS_PER_AXPU];
struct __attribute__(( aligned(256), __section__(".axpudata") )) reg_csr_t axpu_regs [N_AXEMIS_PER_AXPU];

字符串
但是当我检查Map文件时,我发现mem_local,mem_private,mem_knlargs都分配在'.axpudata'部分,但axpu_es和axpu_regs分配在'.bss'部分。然后我发现axpu_es和axpu_regs不一定要在'.axpudata'部分,如果它们在'.bss'部分也不会引起任何问题。我很好奇为什么它们没有被分配到“.axpudata”部分。在什么情况下会发生这种事情?下面是链接器脚本的一部分。

.axpudata : {
    . = ALIGN(65536);
    *(.axpudata)
  }

  /* Uninitialized data */
  . = ALIGN(0x10000);
  .bss :
  {
    __bss_start = .;
    __bss_start__ = .;
    *(.bss*)
    __bss_end = .;
    __bss_end__ = .;
  }


添加:
我刚刚发现属性是在struct和es_t之间给出的,比如struct __attribute__(..) es_t axpu_es[..],但它应该是struct es_t __attribute__(..) axpu_es[...]

42fyovps

42fyovps1#

第一部分指定attributes for variables
第二部分指定类型的属性,其中不包括__section__选项。
所以,显然你可以指定一个特定的变量应该驻留在一个节中,但不是所有类型的变量都应该这样做。

0tdrvxhp

0tdrvxhp2#

我后来发现这个属性是在struct和es_t之间给出的,比如struct __attribute__(..) es_t axpu_es[..],但它应该是struct es_t __attribute__(..) axpu_es[...]。当我修复这个问题时,'axpu_es'和'axpu_regs'数组被分配到'.axpudata'部分。

相关问题