组合优化创建一个syscall?

问题描述 投票:0回答:2

是否由于-O3标志而生成插座SYSCALL? (没有太多意义)

如果那么,我如何提示编译器以避免生成此syscall?

  1. Edit:顺便说一句,代码在C和C ++
  2. Edit:该代码在以下共享库中静态链接:
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
Edit:我发现了为什么会发生这种情况(请参见下面的答案)。如果有人对编译器这样的行为有解释,请分享!!!
    

,尽管可以想象这样的优化,但我还没有听说过,我真的怀疑,因为任何系统电话通常都很昂贵。

如果您在 *nix系统上,则可以通过寻找不确定的符号来验证它

nm

c++ c sockets cross-compiling
2个回答
5
投票

nm -u file1.o file2.o | grep socket

如果有一个呼叫插座的地方。

我提到,我怀疑,有一个优化插入任何系统调用,我希望上面的命令行不会输出。

update:

在我的系统(Ubuntu 12.04,GCC 4.6)中,我在

socket

中找到了以下注释

-O2

优化了更多。 ... 注意:在Ubuntu 8.10及以后的版本中,-d_fortify_source = 2默认设置 并在将-O设置为2或更高时被激活。 这使得其他编译 - 时间和运行时间检查几个LIBC功能。 要禁用,请指定 -u_fortify_source或-d_fortify_source =0.

,也许是通过这种或类似的机制,当优化设置为

U socket

man gcc

整天进行调试后,事实证明,在-o0和-o1,-o1,-o2,-o3下,Arm-cross-gcc comm-cross-cross-gcciles complciles
strcpy()

当您复制的字符串是一个
挥发性char*

时, 。 -O0使用标准用户模式组件编译,而-O1,-O2,-O3则使用额外的syscalls(例如套接字,连接和发送)编译。 ,毕竟,我的最初直觉是合理的:

“我认为可能创建插座的原因是我正在使用 Pthreads和我的两个线程正在通过挥发性 char*。所以我猜也许编译器正在尝试在 当我设置-O3标志时,一种奇特的方式?但是我不确定那是 合理的假设

Edit:以下是一些支持此主张的观察:

我用4个版本编译了我的代码
-O2

上述所有内容都在nm -u上运行nm -u。 dricfs是:

1
投票
-O3

这意味着,当您将strcpy()添加到代码中并使用-O0编译时,没有添加外部符号,而当您将strcpy()添加到代码中并使用-O3 1. without strcpy() -O0 => obj.o0 2. with strcpy() -O0 => obj_strcpy.o0 3. without strcpy() -O3 => obj.o3 4. with strcpy() -O3 => obj_strcpy.o3 符号添加到对象文件中。我将调查ARM上的$> diff obj.o0 obj_strcpy.o0 $> diff obj.o3 obj_strcpy.o3 > U __strcpy_chk $>

实施,以找出Syscalls的来源。截至目前,似乎

U __strcpy_chk

正在做缓冲区溢出检查 - 这是参考:

http://refspecs.linux-foundation.org/lsb_4.0.0/lsb-core-generic/lsb-core-generic/lsb-core-generic/libc-------------strcpy-chk-1.html

Edit:到目前为止,有两种解决方案:Olaf Dietsche提出的一种除-O3外,还使用另一个编译器标志。另一个选择是完全避免使用strcpy(),并使用以下内容:

U __strcpy_chk
    

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.