当我使用 gcc for x86 进行编译时,结构按照我声明它们的顺序放置在该部分中。但是,当我使用 aarch64-none-elf-gcc 对于 ARM 目标进行编译时,结构似乎以相反的顺序放置在该部分中。
typedef struct test_t {
char *test_name;
} test_t;
test_t test1 __attribute__((section("my_section"))) = { "Test 1" };
test_t test2 __attribute__((section("my_section"))) = { "Test 2" };
test_t test3 __attribute__((section("my_section"))) = { "Test 3" };
int main(int argc, char *argv[])
{
extern __start_my_section;
extern __stop_my_section;
for (test_t *t = &__start_my_section; t != &__stop_my_section; t++) {
printf("%s\n",t->test_name);
}
return 0;
}
在 x86 上使用 gcc 构建时,会打印
Test1
Test2
Test3
但是,当使用 aarch64-none-elf-gcc 构建 aarch64 目标时,我得到
Test3
Test2
Test1
有人知道为什么吗?
如果您想确保对象按特定顺序放置,您需要修改链接器脚本
.my_section :
{
KEEP(*(my_section*))
}
或
.my_section :
{
KEEP(SORT_BY_NAME(*(my_section*)))
}
test_t test1 __attribute__((section("my_section1"))) = { "Test 1" };
test_t test2 __attribute__((section("my_section2"))) = { "Test 2" };
test_t test3 __attribute__((section("my_section3"))) = { "Test 3" };
然后总是按照所需的顺序放置