- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以我正在阅读Hacking the Art of Exploitation,在书中,他们在 C 代码中使用了 strcpy()
函数:
1 #include <stdio.h>
2 #include <string.h>
3
4 int main() {
5 char str_a[20];
6
7 strcpy(str_a, "Hello, world!\n");
8 printf(str_a);
9 }
然后他们继续编译源代码并使用 gdb
进行分析。他在第 6 行、strcpy
函数和第 8 行设置了断点,但在 strcpy
上设置断点时,它读取以下内容:
(gdb) break strcpy
Function "strcpy" not defined.
Make breakpoint pending on future shared library load? (y or [n]) y
我知道这是因为库尚未加载,所以它询问他是否想将其作为挂起的断点。然后他运行程序并继续执行断点:
一切对他来说都很顺利,但是当我尝试在我的计算机上重新创建它时,我得到以下信息:
frinto@kali:~/Documents/theclang/programs/helloworld$ gcc -m32 -g -o char_array char_array.c
frinto@kali:~/Documents/theclang/programs/helloworld$ gdb -q char_array
Reading symbols from char_array...done.
(gdb) list
1 #include <stdio.h>
2 #include <string.h>
3
4 int main() {
5 char str_a[20];
6
7 strcpy(str_a, "Hello, world!\n");
8 printf(str_a);
9 }
(gdb) break 6
Breakpoint 1 at 0x11b6: file char_array.c, line 6.
(gdb) break strcpy
Function "strcpy" not defined.
Make breakpoint pending on future shared library load? (y or [n]) y
Breakpoint 2 (strcpy) pending.
(gdb) break 8
Breakpoint 3 at 0x11d7: file char_array.c, line 8.
(gdb) run
Starting program: /home/frinto/Documents/theclang/programs/helloworld/char_array
Breakpoint 1, main () at char_array.c:7
7 strcpy(str_a, "Hello, world!\n");
(gdb) cont
Continuing.
Breakpoint 3, main () at char_array.c:8
8 printf(str_a);
(gdb) cont
Continuing.
Hello, world!
[Inferior 1 (process 4021) exited normally]
(gdb)
注意到它是如何完全跳过 strcpy
断点的吗?好吧,我问我的一个 friend 这里出了什么问题,他告诉我编译时缺少参数 -fno-builtin
。我对这个参数做了一些最小的谷歌搜索,我真正理解的是它可以让你在内置函数上设置断点。因此,我使用 -fno-builtin
参数编译了程序,然后尝试再次重新创建它:
frinto@kali:~/Documents/theclang/programs/helloworld$ gcc -m32 -fno-builtin -g -o char_array char_array.c
frinto@kali:~/Documents/theclang/programs/helloworld$ gdb -q char_array
Reading symbols from char_array...done.
(gdb) list
1 #include <stdio.h>
2 #include <string.h>
3
4 int main() {
5 char str_a[20];
6
7 strcpy(str_a, "Hello, world!\n");
8 printf(str_a);
9 }
(gdb) break 6
Breakpoint 1 at 0x11c6: file char_array.c, line 6.
(gdb) break strcpy
Breakpoint 2 at 0x1040
(gdb) break 8
Breakpoint 3 at 0x11dc: file char_array.c, line 8.
(gdb) run
Starting program: /home/frinto/Documents/theclang/programs/helloworld/char_array
Breakpoint 1, main () at char_array.c:7
7 strcpy(str_a, "Hello, world!\n");
(gdb) cont
Continuing.
Breakpoint 2, 0xf7e510b0 in ?? () from /lib/i386-linux-gnu/libc.so.6
(gdb) cont
Continuing.
Breakpoint 3, main () at char_array.c:8
8 printf(str_a);
(gdb) cont
Continuing.
Hello, world!
[Inferior 1 (process 3969) exited normally]
(gdb)
现在可以了!我有三个问题:
-fno-builtin
参数到底在做什么?strcpy
函数断点 2, 0xf7e510b0 在 ?? () 来自/lib/i386-linux-gnu/libc.so.6
-fno-builtin
参数时,为什么它不要求将 strcpy
断点设置为待处理?抱歉,话题很长,我只是想确保一切都被理解。
最佳答案
来自 man gcc
-fno-builtin
-fno-builtin-function
Don't recognize built-in functions that do not begin with
__builtin_ as prefix. GCC normally generates special code to
handle certain built-in functions more efficiently; for
instance, calls to "alloca" may become single instructions
which adjust the stack directly, and calls to "memcpy" may
become inline copy loops. The resulting code is often both
smaller and faster, but since the function calls no longer
appear as such, you cannot set a breakpoint on those calls, nor
can you change the behavior of the functions by linking with a
different library. In addition, when a function is recognized
as a built-in function, GCC may use information about that
function to warn about problems with calls to that function, or
to generate more efficient code, even if the resulting code
still contains calls to that function. For example, warnings
are given with -Wformat for bad calls to "printf" when "printf"
is built in and "strlen" is known not to modify global memory.
With the -fno-builtin-function option only the built-in
function function is disabled. function must not begin with
__builtin_. If a function is named that is not built-in in
this version of GCC, this option is ignored. There is no
corresponding -fbuiltin-function option; if you wish to enable
built-in functions selectively when using -fno-builtin or
-ffreestanding, you may define macros such as:
#define abs(n) __builtin_abs ((n))
#define strcpy(d, s) __builtin_strcpy ((d), (s))
内置函数允许通过内联函数生成更快的代码,但如手册中所述
you cannot set a breakpoint on those calls
内联函数意味着,它的效果被编译器直接插入的代码所取代,而不是生成函数调用。这节省了函数调用,并且可以更有效地优化,并且通常会导致性能的大幅提高。
但是,代码中不再存在内联函数。调试器断点是通过用一些软件陷阱替换特定地址处的指令或使用特定硬件来识别何时到达断点地址来实现的。但由于该函数已不存在,因此没有与其关联的地址,也无法对其进行断点。
挂起断点是在某些代码上设置断点的方法,这些代码稍后将由程序动态加载。使用-fno-builtin
,可以直接使用strcpy
,并且可以通过gdb直接设置bp。
请注意,调试需要 -g 标志生成的可执行文件中的特定信息。一般像libc这样的系统库没有嵌入调试信息,当进入这些库中的函数时,gdb通过??表示缺少调试信息。
关于c - -fno-builtin 到底在做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54281780/
我收到以下警告,没有提及它发生的行: warning: integer overflows when converted from 'Builtin.Int32' to 'Builtin.Int8'
我不小心删除了我的一个 GAE 项目(用 Go 编写)中的 ah-builtin-datastoreservice 和 ah-builtin-python-bundle 这两个版本。这意味着我的自动备
使用 pig 将数据转换为日期时间时出现问题。导入以下数据集,制表符分隔,我添加了\t 来说明。 5000001 \t 1133938 \t 1273719 \t 2008-06-01 00:03:
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
我试图配置预提交挂接,在运行预提交运行--所有文件时,我收到以下错误:。我已尝试升级pip以解决此问题pip安装--升级pip,但我收到另一个错误:。我尝试检查PIP和PIP3的版本,但现在我也收到了
所以我正在阅读Hacking the Art of Exploitation,在书中,他们在 C 代码中使用了 strcpy() 函数: 1 #include 2 #include 3
为什么下面的代码会产生语法错误? >>> import builtins >>> dir(builtins) ['ArithmeticError', 'AssertionError', 'Attrib
我把这个想法放在了How to make a cross-module variable?在 python3 中。并且懒得使用变量 __builtins__ 而不是模块 builtins。这应该没有什
numpy 的 all 中出现这种怪异现象的原因是什么? >>> import numpy as np >>> np.all(xrange(10)) False >>> np.all(i for i
猫测试.go package main import "builtin" func main() { return } 去运行test.go can't find import: "built
我正在尝试使用 py2exe 将我的 .py 脚本转换为可执行文件。到目前为止,我遇到了许多问题,这些问题在很大程度上已通过下面安装文件中的“选项”得到解决。但是现在我遇到了一个我无法找到解决方案的问
我正在尝试使用原子实现旋转线程屏障,特别是 __sync_fetch_and_add。 https://gcc.gnu.org/onlinedocs/gcc-4.4.5/gcc/Atomic-Buil
在我的单元测试中,我在测试中有 2 个提示。我正在尝试使用 2 @patch("builtins.input") , 但它似乎只取返回值中的 1 个。 @patch("builtins.input")
我正在调试我的程序,然后发生了最后一行,我该如何解决?我使用 -fno-builtin 查看了 strcpy() 但它显示正在调用 __strcpy_sse2_unaligned。 root@19:~
This document说: Not all operations are supported by all target processors. 有人知道哪个处理器支持哪个操作吗? 最佳答案 不是
我刚刚开始使用 Rcpp。我有一个简单的程序,它接受两个数值 vector ,计算它们的并集并返回一个数值 vector 。该 list 粘贴在下方 (test.cpp)。 #include #in
在 python 3 中, >>> import keyword >>> keyword.kwlist 和 >>> import builtins >>> dir(builtins) 是两个不同的列表
昨天我的 Mac 决定将 Xcode 11 自动更新到 12,但是哎呀,我仍然需要 Xcode 11。所以我直接从 https://developer.apple.com/download/more/
在使用 Python 并行编程一书中的示例时,我在使用多处理队列的代码中遇到了以下错误: File "C:\pyDev\multiproc\queue-test.py", line 4, in
我正在尝试使用 HttpClient 在 Flutter 应用程序中执行 SSL 证书固定.我之前已经成功地在原生 Android 应用程序中执行了固定。这是我收到的错误消息: E/flutter (
我是一名优秀的程序员,十分优秀!