Tay*_*r R 2 c c++ sockets compiler-construction cross-compiling
我正在以两种模式编译一个相当复杂的应用程序:调试和发布。在我看来,主要区别是 -O0 与 -O3 (如果需要,我可以提供 makefile 的相关部分)。我试图尽可能避免系统调用生成,因为我正在系统调用模拟模式下模拟此应用程序(下面没有运行操作系统)。我当前遇到的问题是,在发布模式下,编译器会生成一个额外的套接字系统调用,我不希望发生这种情况(并且在调试模式下也不会发生)。
我认为可能创建套接字的原因是我正在使用 pthreads 并且我的两个线程正在通过 易失性 char* 进行通信。所以我猜测当我设置 -O3 标志时编译器可能试图以一种奇特的方式实现它?但我不确定这是否是一个合理的假设。
编辑:顺便说一句,代码是用 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)
编辑:我发现为什么会发生这种情况(请参阅下面我的答案)。如果有人对编译器为何如此行为有解释,请分享!
虽然,人们可以想象这样的优化,但我还没有听说过这样的优化,我真的很怀疑,因为任何系统调用通常都非常昂贵。
如果您在 *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。