是否由于-O3标志而生成插座SYSCALL? (没有太多意义)
如果那么,我如何提示编译器以避免生成此syscall?
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
nm -u file1.o file2.o | grep socket
我提到,我怀疑,有一个优化插入任何系统调用,我希望上面的命令行不会输出。update:
在我的系统(Ubuntu 12.04,GCC 4.6)中,我在
socket
优化了更多。 ... 注意:在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 complcilesstrcpy()当您复制的字符串是一个
挥发性char*时, 。 -O0使用标准用户模式组件编译,而-O1,-O2,-O3则使用额外的syscalls(例如套接字,连接和发送)编译。 ,毕竟,我的最初直觉是合理的:
“我认为可能创建插座的原因是我正在使用 Pthreads和我的两个线程正在通过挥发性 char*。所以我猜也许编译器正在尝试在 当我设置-O3标志时,一种奇特的方式?但是我不确定那是 合理的假设
Edit:以下是一些支持此主张的观察:
我用4个版本编译了我的代码
-O2
上述所有内容都在nm -u上运行nm -u。
dricfs是:-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
$>
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