在着名的论文“Smashing the Stack for Fun and Profit”中,它的作者采用了C函数 void function(int a, int b, int c) { char buffer1[5]; char buffer2[10]; } 并生成相应的汇编代码输出 pushl %ebp movl %esp,%ebp subl $20,%esp 作者解释说,由于计算机以字大小的倍数寻址存储器,编译器在堆栈上保留20个字节(缓冲区1为8个字节,缓冲区2为12个字节)。 我试图重新创建这个例子并获得以下内容 pushl %ebp movl %esp, %ebp subl $16, %esp 不同的结果! 我尝试了缓冲区1和缓冲区2的各种大小组合,似乎现代的gcc不再将缓冲区大小填充到字大小的倍数。 相反,它遵循-mpreferred-stack-boundary选项。 作为一个例子 – 使用纸张的算术规则,对于buffer1 [5]和buffer2 [13],我会在堆栈上保留8 + 16 = 24个字节。 但实际上我有32个字节。 这篇论文很古老,自那以后发生了很多事情。 我想知道,究竟是什么推动了这种行为的改变? 这是向64位机器的转变吗? 或者是其他东西? 编辑 […]
我相信这不是一个重复的问题,在发布此问题之前,我已经看到了所有问题/答案。 我想我在这里有不同的情况。 我使用Ubuntu 12.04并下载了GTK 2和3 。 我从GNOME的网站上复制了一个简单的GTK源代码。 但是当我在终端中使用此命令时: gcc `pkg-config –cflags –libs gtk+-3.0` hello.c -o hello 我明白了: hello.c:(.text+0x17): undefined reference to `gtk_init’ hello.c:(.text+0x23): undefined reference to `gtk_window_new’ hello.c:(.text+0x47): undefined reference to `gtk_main_quit’ hello.c:(.text+0x5b): undefined reference to `g_signal_connect_data’ hello.c:(.text+0x67): undefined reference to `gtk_widget_show’ hello.c:(.text+0x6c): undefined reference to `gtk_main’ 这是我的代码: #include int main (int argc, char *argv[]) […]
在gcc手册中,给出了“C标准库本身存储在’/usr/lib/libc.a’中”。 我安装了gcc,但在上述位置找不到libc.a. 很想知道它的位置。 我在/ usr / lib位置找到了很多.so文件。 那些是什么?
从文档的描述中,他们似乎做了同样的事情,除了“并非所有系统”支持共享和“只有一些系统”支持符号(不清楚这些是否是同一组系统): -shared生成一个共享对象,然后可以将其与其他对象链接以形成可执行文件。 并非所有系统都支持此选项。 对于可预测的结果,还必须指定在指定此选项时用于生成代码(-fpic,-fPIC或模型子选项)的同一组选项。[1] -symbolic在构建共享对象时绑定对全局符号的引用。 警告任何未解析的引用(除非被链接编辑器选项-Xlinker -z -Xlinker defs覆盖)。 只有少数系统支持此选项。 我怀疑区别在于“生成一个共享对象,然后可以与其他对象链接以形成可执行文件”部分,但这听起来像任何库都是如此。 这是否意味着生成的共享对象也可以静态链接?
我在mac机器上使用OS 10.9。 我想知道我正在使用的gcc版本。 所以我在终端上尝试了gcc –version ,结果如下: $ gcc –version Configured with: –prefix=/Applications/Xcode5-DP.app/Contents/Developer/usr –with-gxx-include-dir=/Applications/Xcode5-DP.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/usr/include/c++/4.2.1 Apple LLVM version 5.0 (clang-500.1.58) (based on LLVM 3.3svn) Target: x86_64-apple-darwin13.0.0 Thread model: posix 在输出中,没有与gcc相关的细节,但clang就在那里。 我很困惑gcc命令是执行clang还是gcc(gnu)。
Valgrind是否有任何已知的误报? 我通过fmemopen函数得到’条件跳转或移动取决于未初始化的值’,用C语言编写并用GCC编译。 我能确定这是真的吗? 编辑:抑制文件中是否存在已知问题? 在程序中是否可以做一些事情,这不是真正的错误,但Valgrind会说它们是? 如果存在已知问题,列表会很好。
我在linux上使用c中的结构。 我开始使用位字段和“打包”属性,我遇到了一个奇怪的行为: struct t1 { int a:12; int b:32; int c:4; }__attribute__((packed)); struct t2 { int a:12; int b; int c:4; }__attribute__((packed)); void main() { printf(“%d\n”,sizeof(t1)); //output – 6 printf(“%d\n”,sizeof(t2)); //output – 7 } 为什么两个结构 – 完全相同 – 采用不同的字节数?
到目前为止,我已经达到了: #define ADEFINE “23” #pragma message (“ADEFINE” ADEFINE) 哪个有效,但是如果ADEFINE不是字符串怎么办? #define ADEFINE 23 #pragma message (“ADEFINE” ADEFINE) 原因: 警告:格式错误的’#pragma message’,被忽略 理想情况下,我希望能够处理任何值,包括undefined。
鉴于代码: struct s1 {unsigned short x;}; struct s2 {unsigned short x;}; union s1s2 { struct s1 v1; struct s2 v2; }; static int read_s1x(struct s1 *p) { return p->x; } static void write_s2x(struct s2 *p, int v) { p->x=v;} int test(union s1s2 *p1, union s1s2 *p2, union s1s2 *p3) { if (read_s1x(&p1->v1)) { unsigned short […]
在构建dbus示例时,我发现我们需要在gcc中添加pkg-config。 例如: gcc `pkg-config –cflags –libs dbus-1` -o pkg-config –cflags –libs dbus-1什么意义? 这是什么pkg-config? 什么是额外的cflags? 什么是–libs在这里?