编译器优化创建系统调用?

Tay*_*r R 2 c c++ sockets compiler-construction cross-compiling

我正在以两种模式编译一个相当复杂的应用程序:调试和发布。在我看来,主要区别是 -O0 与 -O3 (如果需要,我可以提供 makefile 的相关部分)。我试图尽可能避免系统调用生成,因为我正在系统调用模拟模式下模拟此应用程序(下面没有运行操作系统)。我当前遇到的问题是,在发布模式下,编译器会生成一个额外的套接字系统调用,我不希望发生这种情况(并且在调试模式下也不会发生)。

我认为可能创建套接字的原因是我正在使用 pthreads 并且我的两个线程正在通过 易失性 char* 进行通信。所以我猜测当我设置 -O3 标志时编译器可能试图以一种奇特的方式实现它?但我不确定这是否是一个合理的假设。

  1. 是否有可能由于 -O3 标志而生成套接字系统调用?(没有太大意义)
  2. 如果是这样,我如何提示编译器避免生成此系统调用?

编辑:顺便说一句,代码是用 C 和 C++ 编写的

编辑:代码静态链接到以下共享库:

libstdc++.a 
libm.a 
libglib-2.0.a 
-static-libgcc 
*special pthreads library*
Run Code Online (Sandbox Code Playgroud)

另外,我发现二进制文件中发生对套接字的调用的位置:

8c716:       db28            blt.n   8c76a <openlog_internal+0xf2>
8c718:       f8d9 1008       ldr.w   r1, [r9, #8]
8c71c:       4620            mov     r0, r4
8c71e:       2200            movs    r2, #0
8c720:       f441 2100       orr.w   r1, r1, #524288 ; 0x80000
8c724:       f001 e97c       blx     8da20 <__socket>
8c728:       4b20            ldr     r3, [pc, #128]  ; (8c7ac <openlog_internal+0x134>)
8c72a:       681b            ldr     r3, [r3, #0]
8c72c:       f8c9 0004       str.w   r0, [r9, #4]
8c730:       b943            cbnz    r3, 8c744 <openlog_internal+0xcc>
8c732:       1c43            adds    r3, r0, #1
Run Code Online (Sandbox Code Playgroud)

编辑:我发现为什么会发生这种情况(请参阅下面我的答案)。如果有人对编译器为何如此行为有解释,请分享!

Ola*_*che 5

虽然,人们可以想象这样的优化,但我还没有听说过这样的优化,我真的很怀疑,因为任何系统调用通常都非常昂贵。

如果您在 *nix 系统上,您可以通过查找未定义的符号来验证它nm

nm -u file1.o file2.o | grep socket
Run Code Online (Sandbox Code Playgroud)

应该在某处显示缺少的socket符号

        U socket
Run Code Online (Sandbox Code Playgroud)

如果某个地方有对套接字的调用。

正如我所提到的,我怀疑是否存在插入任何系统调用的优化,并且我期望上面的命令行没有输出。

更新:

在我的系统(Ubuntu 12.04,gcc 4.6)上,我在man gcc

-O2进一步优化。...
注意:在 Ubuntu 8.10 及更高版本中,默认设置 -D_FORTIFY_SOURCE=2,并在 -O 设置为 2 或更高时激活。这可以对多个 libc 函数进行额外的编译时和运行时检查。要禁用,请指定 -U_FORTIFY_SOURCE 或 -D_FORTIFY_SOURCE=0。

因此,也许通过这个或类似的机制,当优化设置为-O2或时,会包含一些代码-O3