使用 aarch64-none-elf-gcc 编译时,自定义部分内的结构会反转

问题描述 投票:0回答:1

当我使用 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

有人知道为什么吗?

c gcc x86 arm64 aarch64-none-elf-gcc
1个回答
0
投票

如果您想确保对象按特定顺序放置,您需要修改链接器脚本

.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" };

然后总是按照所需的顺序放置

© www.soinside.com 2019 - 2024. All rights reserved.