草庐IT

c - gcc -O2 与没有导致错误

当编译包含open("FILENAME",O_RDONLY);而没有-O2标志的文件时,一切都很好。但是当-O2打开时,我得到:/usr/include/x86_64-linux-gnu/bits/fcntl2.h:Infunction‘open’:/usr/include/x86_64-linux-gnu/bits/fcntl2.h:44:7:error:invaliduseof‘__builtin_va_arg_pack_len()’/usr/include/x86_64-linux-gnu/bits/fcntl2.h:45:26:error:callto‘__open_too_m

c - 奇怪的 gcc 警告行为

我正在开发一个linux驱动程序,我收到了这条警告消息:/home/andrewm/pivot3_scsif/pivot3_scsif.c:1090:warning:ignoringreturnvalueof‘copy_from_user’,declaredwithattributewarn_unused_result违规行是:if(copy_from_user(tmp,buf,count)查看了copy_from_user的声明,发现它返回的是一个unsignedlong,显然比较总是会失败,所以返回值不会影响比较.那部分是有道理的,但是为什么gcc不警告它是有符号/无符号比较的事实

使用 GCC 编译依赖 Open SSL 的 C 程序

我必须在linux(ubuntu)上用gcc编译一个C程序。这取决于openssl库。#include#include#include#include#include#include#include我已经从存储库下载了libcrypto和libopenssl包。但我仍然收到此错误root@kali:~/openssl#gccopensslhello.c/tmp/ccTahV7g.o:Infunction`pem2X509':opensslhello.c:(.text+0x15):undefinedreferenceto`BIO_s_mem'opensslhello.c:(.text+0

c - gcc/clang 如何假定字符串常量的地址是 32 位的?

如果我编译这个程序:#includeintmain(intargc,char**argv){printf("helloworld!\n");return0;}对于x86-64,asm输出使用movl$.LC0,%edi/callputs.(Seefullasmoutput/compileoptionsongodbolt.)我的问题是:GCC如何知道字符串的地址可以放入32位立即操作数?为什么不需要使用movabs$.LC0,%rdi(即movr64,imm64,不是零或符号扩展的imm32)。AFAIK,没有什么说加载程序必须决定在任何特定地址加载数据部分。如果字符串存储在1ULL以上

linux - 构建 GCC 4.6 - libmpfr.so.4 - 无法打开共享对象文件

我正在尝试在CentOS5.5版(最终版)下构建GCC4.6。我刚刚构建了GMP-5.0.1、MPC-0.9和MPFR-3.0.1,并使用了以下配置命令:../configure--prefix=/users/xxxx/apps/mygcc4.6--disable-checking--enable-threads=posix--enable-languages=c,c++,fortran--with-mpfr=/users/xxxx/code/gcc/mpfr-3.0.1-install-cyprus--with-gmp=/users/xxxx/code/gcc/gmp-5.0.1-i

在 gcc 内联汇编中调用函数

比如说,我想在gcc的内联汇编中调用具有以下签名的函数。我该怎么做?intsome_function(void*arg); 最佳答案 通常你会想做类似的事情void*x;asm("..codethatwritestoregister%0":"=r"(x):...intr=some_function(x);asm("..codethatusestheresult...":...:"r"(r),...也就是说,您根本不想在内联汇编中进行函数调用。这样您就不必担心调用约定或堆栈框架管理的细节。

linux - 用于 arm-linux-gcc 的 C/C++ 目标的简单 makefile

我想使用arm-linux-gcc编译器套件[arm-linux-gcc(Buildroot2011.08)4.3.6]交叉编译一个简单的ARM架构程序。我尝试使用一个简单的makefile来编译C代码,并使用另一个简单的makefile来编译C++代码。例如,下面复制了我的C代码生成文件,但它没有创建用于在我的嵌入式系统上运行的ELF二进制文件。主机系统是x64GNULinux。这是我为C程序编写的非常简单的makefile的list:CC=arm-linux-gccCFLAGS=-Wallmain:test.oclean:rm-ftesttest.o上面复制的makefile只创建

linux - 关于 GCC 链接器搜索顺序的一些问题

我有一些关于gcc链接顺序的问题。GCCman说链接器默认从左到右搜索符号而不重复搜索。这是我的测试:主.c#include#includeintmain(){printf("HELLOWROLD\n");return0;}打印文件#include#includeintprintf(constchar*fmt,...){write(1,"AAA\n",4);}[root@lenovotestcode]#gcc-c-fno-builtin-printf*.c[root@lenovotestcode]#gcc-otestmain.oprintf.o[root@lenovotestcode]

c++ - gcc 4.7 出现 super 奇怪的段错误——错误?

这是我一直在尝试编译的一段代码:#include#defineN3structData{intA[N][N];intB[N];};intfoo(intuloc,constintA[N][N],constintB[N]){for(unsignedintj=0;jA,d->B);}intmain(int,char**){Datad;for(inti=0;i是的,它看起来很奇怪,目前没有做任何有用的事情,但它是我最初遇到问题的更大程序的最简洁版本。它在GCC(G++)4.4和4.6上编译和运行得很好,但如果我使用GCC4.7,并启用第三级优化:g++-4.7-g-O3prog.cpp-opr

c++ - Clang/GCC 真的支持延迟加载功能吗?

如果您有真实经历与上述标题相关的内容,您是否介意对此发表评论?我试图在Ubuntu上使用Clang和GCC延迟加载一个共享对象(我实际上不介意使用哪个编译器),但它们看起来并不真正支持任何延迟加载功能(我期望延迟加载功能在父对象中放置一个stub,该对象试图在需要功能时按需加载另一个对象,但实际上并没有)。以下命令显示我试图将libbar.so延迟加载到libfoo.so:clangbar.c-fPIC-shared-olibbar.soclangfoo.c-Wl,-zlazy,lL'/path/to/where/lib/is',-lbar-ofoo如果libbar.so不存在,您将看