【发布时间】:2014-05-13 18:59:40
【问题描述】:
我正在以两种模式编译一个相当复杂的应用程序:调试和发布。在我看来,主要区别在于 -O0 与 -O3 (如果需要,我可以提供 makefile 的相关部分)。我试图尽可能避免系统调用生成,因为我在系统调用仿真模式下模拟这个应用程序(没有操作系统在下面运行)。我目前遇到的问题是,在发布模式下,编译器会生成一个额外的套接字系统调用,我不想发生这种情况(在调试模式下也不会发生)。
我认为可能会创建套接字的原因是我正在使用 pthreads 并且我的两个线程正在通过 volatile char* 进行通信。所以我猜当我设置 -O3 标志时,编译器可能试图以一种奇特的方式实现它?但我不确定这是否是一个合理的假设。
- 是否有可能因为 -O3 标志而生成了套接字系统调用? (没有太大意义)
- 如果是这样,我如何提示编译器避免生成此系统调用?
编辑:顺便说一句,代码是用 C 和 C++ 编写的
编辑:代码静态链接到以下共享库:
libstdc++.a
libm.a
libglib-2.0.a
-static-libgcc
*special pthreads library*
另外,我发现了在二进制文件中调用套接字的位置:
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
编辑:我发现了为什么会发生这种情况(请参阅下面的答案)。如果有人解释为什么编译器会这样,请分享!!!
【问题讨论】:
-
发布编译器为其生成系统调用的代码。
-
除了发布代码之外,您可能还想通过比较为 -O0 与 -O3 生成的程序集来尝试自己解决这个问题。真的会生成系统调用吗?
-
@CodyGray 感谢您的评论。我现在正在运行那个实验。为什么你认为这可能是有问题的?另外,你能建议一个简单的方法来做到这一点(我假设 objdump,但二进制文件是 2MB 和 5MB)。
-
@MichaelBurr 目前我不确定代码套接字是在哪里生成的,我会尽快发布确切位置。
-
-O3 可能是内联的东西。如果是这样,您可以在该函数上使用编译指示来停止它。 ...或在使用 -fno-inline 编译该对象时完全关闭内联 ...您可以将其切换为 -finiline-small-functions。
标签: c++ c sockets compiler-construction cross-compiling