gpt4 book ai didi

c - 如何在c程序中使用分段?

转载 作者:行者123 更新时间:2023-11-30 17:09:52 27 4
gpt4 key购买 nike

属于同一节但不同子节的代码的放置顺序由子节编号定义。我需要在 C 程序中使用此功能 - 即我需要两个函数位于同一部分并按特定顺序。 GCC 根据需要对同一部分中的函数进行重新排序,因此这就是我需要小节的原因。这是部分的语法 - 我不知道如何使用 __attribute__ 语法指定子部分。

void func1() __attribute__ ((section ("mysection")));

请参阅下面 Jester 的注释以了解汇编语法。我正在使用 gcc,所以我假设使用气体汇编器?

这里有一个很长的解释,解释为什么我已经到了需要小节的地步。也许我一路上的一个结论是不正确的,你可以帮助我避免这种情况。

问:为什么不创建单独的部分并连续加载它们?

答:我有一个单独的问题,我需要能够提前找出函数的确切起始地址。

问:为什么需要知道地址?

答:我想将函数中的一些代码(而不是函数本身)与特定的对齐方式对齐

问:为什么不使用.align?

答:我发现由于某种原因在 c 函数中使用 .align 会强制该函数本身与该值对齐,但我不希望这样 - 所以我想出了一个丑陋的宏替代方案来替代 .align指令:

b 1f

. = . + (1 << #alignment") - (("#section_start" + .) & ((1 << "#alignment") - 1))

1:

问:为什么不使用标签来计算您当前的位置?或者加载器文件中的标签?

答:汇编器不允许 - 我必须使用点运算符。

问:再告诉我一下为什么这里需要section_start?

A:点运算符是相对于节的开头,它不是绝对地址

问:为什么你要在 C 中尝试这种低级的东西,这很愚蠢

答:我同意这很愚蠢,但请一起玩。

最佳答案

我不知道如何使用小节,但我相信这个 GCC 选项强制函数顺序,而且我似乎至少有一个示例,它修复了我的测试中的顺序。我有点担心必须设置 -fno-section-anchors (似乎你不能只使用 -fno-toplevel-reorder),但这可能是我现在拥有的最好的解决方法。

这种方法的一个问题是我无法将每个函数放在单独的部分中 - 这样做的好处是允许我使用链接器脚本来计算函数的结尾(对我也很有用)。

https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html

-fno-toplevel-reorder -fno-section-anchors

关于c - 如何在c程序中使用分段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33114267/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com