我知道如何使用-mthumb和-mno-thumb编译器标志,或多或少地了解它正在做什么。
但是-mthumb-interlinking标志在做什么?什么时候需要,如果我在项目设置中设置'compile for thumb',它是否为整个项目设置了?
感谢您的信息!
答案 0 :(得分:1)
打开终端并输入man gcc
你的意思是-mthumb-interwork?
-mthumb-interwork
Generate code which supports calling between the ARM and Thumb
instruction sets. Without this option the two instruction sets
cannot be reliably used inside one program. The default is
-mno-thumb-interwork, since slightly larger code is generated when
-mthumb-interwork is specified.
如果这与构建配置有关,您应该能够为每个配置单独设置它,例如Release或Debug。
您为什么要更改这些设置?我知道使用拇指指令可以节省一些内存,但是在这种情况下它会保存得足够重要吗?
答案 1 :(得分:0)
我的应用程序使用了thumb和vfp代码,但我从来没有特别说明 set -thumb-interwork flag ..怎么可能?
根据手册页,没有那个标志的两个指令集
无法在一个程序中可靠地使用。
它说“可靠”;因此,如果没有这个选项,它们似乎仍然可以在一个程序中混合,但它可能“不可靠”。我认为通常将两个指令集混合起来,编译器足够聪明,可以确定何时必须从一个集合切换到另一个集合。但是,可能存在边界情况,编译器无法正确理解,并且可能无法看到它应该在此处切换指令集,导致应用程序失败(大多数可能它会崩溃)。此选项生成特殊代码,因此无论您的代码是什么,切换始终正确且可靠地进行;缺点是每个全局可见函数都需要这个额外的代码,因此增加了二进制端(我不知道它是否也可能会减慢函数调用的速度,我个人希望如此)。
请注意以下两个设置:
-mcallee超互通
提供文件中所有外部可见的功能 编译了ARM指令集头 在执行其余部分之前切换到Thumb模式 功能。这允许这些 从非交互代码调用的函数。-mcaller超互通
允许通过函数指针调用(包括虚拟调用) 函数)无论如何都能正确执行 是否已编译目标代码 是否互通。开销很小 如果这个选项,执行函数指针的成本 已启用。
虽然我认为你只需要那些,但是在构建库以便与其他项目一起使用时;但我不确定。 GCC拇指处理绝对是“未记录的”。