如何在c程序中使用小节?

时间:2015-10-13 23:30:22

标签: c assembly

属于同一部分但不同子部分的代码具有由子部分编号定义的放置顺序。我需要在c程序中使用这个功能 - 即我需要两个函数在同一部分和特定顺序。 GCC在同一部分重新订购功能,这就是我需要小节的原因。以下是部分的语法 - 我无法弄清楚如何使用__attribute__语法指定子部分。

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

有关汇编语法,请参阅下面的Jester评论。我正在使用gcc,所以我假设是气体汇编程序?

这里有一个很长的解释,为什么我已经到了需要小节的地步。也许我的一个结论是错误的,你可以帮我避免这个。

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

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

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

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

问:为什么不使用.align?

答:我发现在交流功能中使用.align由于某种原因强制使自身功能与该值对齐,我不希望这样 - 所以我想出了一个丑陋的宏替代.align指令:

b 1f

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

1:

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

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

问:再次告诉我为什么你需要section_start?

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

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

答:我同意这是愚蠢的,但是一起玩。

1 个答案:

答案 0 :(得分:0)

我无法弄清楚如何使用小节,但我相信这个GCC选项强制功能顺序,我似乎至少有一个例子来修复我的测试中的排序。我有点担心必须设置-fno-section-anchors(看起来你不能只使用-fno-toplevel-reorder),但这可能是我现在最好的解决方法。

这种方法的一个问题是我失去了将每个函数放在不同部分的能力 - 这样可以让我使用链接器脚本来计算函数的结尾(对我来说也很有用)。

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

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