当前位置: 首页 > 知识库问答 >
问题:

关于gcc-O和更高版本的死代码删除程序

萧星火
2023-03-14

我写了一个像这样的简单代码

#include <stdlib.h>
#include <stdio.h>

//#define CONFIG_TARGET_X86_64

#ifdef CONFIG_TARGET_X86_64
static void A( )
{
    printf("A\n");
}
#else
void A( );
#endif

static void B( )
{
    printf("B\n");
}


static int xx( )
{
#ifdef CONFIG_TARGET_X86_64
  return 1;
#else
  return 0;
#endif
}

int main(void)
{
  if (xx( ))   /* define CONFIG_TARGET_X86_64 */
    A( );
  else
    B( );
}

如果我们不定义< code > CONFIG _ TARGET _ X86 _ 64 ,< code>xx( )将始终返回< code>FALSE,所以只声明而未实现的functiopn A将永远不会被调用(死代码)。

用gcc-O0编译它

/tmp/cctSpgGk.o: In function `main':
1.c:(.text+0x34): undefined reference to `A'
collect2: error: ld returned 1 exit status

但它可以由-O1或更高版本编译

使用GCC 6.1.0版

O1选项中的一个优化选项似乎消除了死代码,我看到了关于GCC的优化文档

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

但我找不到。

所以我只想在-O0选项下编译这段代码,可能吗?有没有一些优化标志可以帮我做到这一点?

谢啦

共有2个答案

况嘉运
2023-03-14

您可以声明A为弱:

void A (void) __attribute__ ((weak));

然后链接器将忽略未定义的符号引用,但调用此函数将导致崩溃。

施子民
2023-03-14

这里值得注意的是,这声明了一个方法签名:

void A( );

其中声明了一个方法实现:

void A( ) { };

这两者之间有巨大的区别。

如果使用调用引用函数,则需要实现它。编译器将根据其他因素决定是否优化该函数调用,但它需要知道该函数做什么,而不仅仅是如何调用。

 类似资料:
  • 我编译了以下C代码: 使用命令 .下面是输出中的 Bar 函数: 我有几个关于这个汇编代码的问题: > 如果函数体中既没有使用也没有使用rsp,那么"",""和""的目的是什么? 为什么和自动包含C函数的参数(分别为和)而不从堆栈中读取它们? 我尝试将Foo的大小增加到88字节(11s),指令变成了。将我的结构设计为“圆形”大小以避免乘法指令(以优化数组访问)是否有意义?指令被替换为:

  • 我读到,如果我们想在google play中更新应用程序,版本代码应该高于之前的apk文件。我有一个版本代码为20,版本名为1.0的应用程序。所以要更新应用程序,我应该如何增加版本代码?应该增加10吗?还是一个就够了?也就是说,版本代码从20到30还是版本代码从20到21?

  • 我正在为64位mips机器使用gcc编译器。我注意到生成的一段汇编代码很有趣。下面是详细信息: 通常,bnez将立即跳到0xb0。但在0xb0之后的块中,我确信程序必须使用a1作为参数。但是我们可以看到,在0xb0之后,a1从未出现在块中。 但是a1在0x58中使用,就在bnez(0x54)之后。 那么0x54和0x58指令有可能同时执行吗?超标量处理器通过同时将多条指令分派到处理器上的冗余功能单

  • 问题内容: 我想知道Java如何处理以下情况: 假设我有一个名为Debug的类,它看起来像这样: 并假设我的代码有一个看起来像这样的调用: 我有几个问题: 如果 isAssertEnabled 标志设置为 false ,是否将整个对Debug.assertTrue的调用编译出来?请注意,仅在调用函数后才检查isAssertEnabled == true。 如果整个调用确实被编译出来了,是否也意味着

  • 0.1.3.关于本书的代码 本书旨在为读者提供一切力所能及的帮助。除非用作特殊用途,你可以在程序或者文档中随意使用本书的代码,而不必向我们申请许可。比如基于本书代码所开发的程序无需许可,而出售或以CD-ROM形式分发O'Reilly出版物中的例子则需要许可;在回答问题时引用本书的例子不需要许可,而在产品的文档中大量引用本书的例子则需要许可。 我们鼓励保留出处信息,但不强制。通常出处信息可以包含书名

  • 将和升级到和或更高版本时,我们遇到一个问题 java.lang.InternalError:无法在org.bouncycastle.jcajce.provider.drbg.drbg$urlseededsecurerandom$1上打开随机源。在org.bouncycastle.jcajce.provider.drbg.drbg$urlseededsecurerandom$1上运行(drbg.ja