Tag: gcc

试图粉碎堆栈

我试图重现stackoverflow结果,我从Aleph One的文章“粉碎堆栈的乐趣和利润”中读到(可以在这里找到: http : //insecure.org/stf/smashstack.html )。 试图覆盖返回地址似乎对我不起作用。 C代码: void function(int a, int b, int c) { char buffer1[5]; char buffer2[10]; int *ret; //Trying to overwrite return address ret = buffer1 + 12; (*ret) = 0x4005da; } void main() { int x; x = 0; function(1,2,3); x = 1; printf(“%d\n”,x); } 拆卸主要: (gdb) disassemble main Dump […]

使用GCC的内联汇编直接调用

如果要从内联汇编调用C / C ++函数,可以执行以下操作: void callee() {} void caller() { asm(“call *%0” : : “r”(callee)); } 然后GCC将发出如下所示的代码: movl $callee, %eax call *%eax 这可能会有问题,因为间接调用会破坏旧CPU上的管道。 由于callee的地址最终是常量,因此可以想象可以使用i约束。 引自GCC在线文档 : ‘我” 允许立即整数操作数(具有常量值的操作数)。 这包括符号常量,其值仅在汇编时或以后知道。 如果我尝试像这样使用它: asm(“call %0” : : “i”(callee)); 我从汇编程序中收到以下错误: 错误:后缀或操作数对`call’无效 这是因为GCC会发出代码 call $callee 代替 call callee 所以我的问题是是否可以使GCC输出正确的call 。

不完整数组类型的p 和* p的等价性

考虑以下代码(它是由于此讨论而产生的): #include void foo(int (*p)[]) { // Argument has incomplete array type printf(“%d\n”, (*p)[1]); printf(“%d\n”, p[0][1]); // Line 5 } int main(void) { int a[] = { 5, 6, 7 }; foo(&a); // Line 10 } GCC 4.3.4 抱怨错误消息: prog.c: In function ‘foo’: prog.c:5: error: invalid use of array with unspecified bounds GCC 4.1.2中的相同错误消息,似乎是-std=c99 , […]

如何在gcc中强制执行C89样式的变量声明?

我在代码库上工作,主要是带有一点点C ++的C语言,并且主要是用gcc构建的,但偶尔需要用MSVC构建。 微软的C编译器仍然是C89,只有一些小的扩展,它仍然不支持C ++ / C99的混合代码和变量定义。 因此,我需要找到一种方法来防止开发人员在使用gcc时编写无序代码/变量定义,否则构建随后会破坏MSVC。 如果我使用gcc -std=c89那么一切都会中断,因为不允许使用C ++风格的注释(可能还有其他问题,但我还没有进一步研究过)。 如果我使用gcc -std=gnu89则允许无序代码/变量定义,这对我也没有帮助。 有任何想法吗 ? 我想我只需要像gcc -std=c99 -fno-inline-variable-definitions这样的选项,如果存在这样的选项的话。

float_t有什么意义,应该何时使用?

我正在与一个使用旧版本GCC(确切地说是3.2.3)的客户合作,但是想要升级,并且作为升级到更新版本的绊脚石的一个原因是float_t类型的大小不同这当然是正确的: 在GCC 3.2.3上 sizeof(float_t) = 12 sizeof(float) = 4 sizeof(double_t) = 12 sizeof(double) = 8 关于GCC 4.1.2 sizeof(float_t) = 4 sizeof(float) = 4 sizeof(double_t) = 8 sizeof(double) = 8 但这种差异的原因是什么? 为什么尺寸变小,什么时候应该也不应该使用float_t或double_t ?

在OS X El Capitan上使用libssl编译C程序?

我有一个使用libssl的简单C程序。 在Linux上,我安装了openssl-dev软件包并使用以下行编译程序: gcc test_libssl.c -o test_libssl -lcrypto -lssl 现在我想在我的Mac上做同样的事情。 同一行导致: fatal error: ‘openssl/conf.h’ file not found 我尝试通过brew install openssl安装openssl(openssl-dev没有工作)和home-brew 这给了我: … ==>安装openssl ==>正在下载https://www.openssl.org/source/openssl-1.0.2a.tar.gz curl:(22)请求的url返回错误:404 Not Found 我找到了一个没有答案的相关SO问题 。 我也试过了 brew info openssl 并得知 这个公式只是keg。 Mac OS X已经提供此软件并且并行安装另一个版本会造成各种麻烦。 Apple不赞成使用OpenSSL来支持自己的TLS和加密库 为了能够在OS X上编译libssl-C程序,我需要做什么/安装? 或者,首先是一个坏主意(鉴于上面的警告)? 更新: 我用brew安装了openssl。 我不确定这是不是问题,但我更新了brew。 采取brew的建议 您应该将/ usr / local的所有权和权限更改回您的用户帐户。 sudo chown -R $(whoami):admin / usr […]

是否可以在C ++中子类化C结构并在C代码中使用指向结构的指针?

这样做是否有副作用: C代码: struct foo { int k; }; int ret_foo(const struct foo* f){ return fk; } C ++代码: class bar : public foo { int my_bar() { return ret_foo( (foo)this ); } }; C ++代码周围有一个extern “C” ,每个代码都在自己的编译单元中。 这可以跨编译器移植吗?

GCC – 如何重新排列堆栈?

我尝试构建一个使用pthreads和__m128 SSE类型的应用程序。 根据GCC手册,默认堆栈对齐是16个字节。 为了使用__m128,要求是16字节对齐。 我的目标CPU支持SSE。 我使用的GCC编译器不支持运行时堆栈重组(例如-mstackrealign)。 我不能使用任何其他GCC编译器版本。 我的测试应用程序如下: #include #include void *f(void *x){ __m128 y; … } int main(void){ pthread_t p; pthread_create(&p, NULL, f, NULL); } 应用程序生成exception并退出。 经过简单的调试(printf“%p”,&y)后,我发现变量y不是16字节对齐的。 我的问题是:如何在不使用任何GCC标志和属性(它们没有帮助)的情况下正确地重新对齐堆栈(16字节)? 我应该在这个线程函数f()中使用GCC内联汇编程序吗?

整数立方根

我正在寻找64位(无符号)立方根的快速代码。 (我正在使用C并使用gcc进行编译,但我想大多数所需的工作都是语言和编译器无关的。)我将通过ulong表示一个64位的unisgned整数。 给定输入n我需要(整数)返回值r r * r * r <= n && n < (r + 1) * (r + 1) * (r + 1) 也就是说,我想要n的立方根,向下舍入。 基本代码如 return (ulong)pow(n, 1.0/3); 因为向范围的末端舍入而不正确。 简单的代码就像 ulong cuberoot(ulong n) { ulong ret = pow(n + 0.5, 1.0/3); if (n = 18446724184312856125ULL) return 2642245ULL; if (ret * ret * ret > […]

clang和gcc之间的区别

我在不同的项目中使用了这两个编译器。 它们在代码处理和输出生成方面有何不同? 例如, gcc和clang都有-O2选项用于优化。 它们在优化代码方面是否以相同的方式运行(高级别)? 我做了一点测试,例如,如果我有以下代码: int foo(int num) { if(num % 2 == 1) return num * num; else return num * num +1; } 以下是带有-ng的clang和gcc的输出程序集: —-gcc 5.3.0—– —-clang 3.8.0—- foo(int): foo(int): movl %edi, %edx movl %edi, %eax shrl $31, %edx shrl $31, %eax leal (%rdi,%rdx), %eax addl %edi, %eax andl $1, %eax andl […]