我正在使用rdtsc和cpuid指令(使用易失性内联汇编指令)来测量程序的CPU周期。 rdtsc指令为Linux上的程序(带速度优化-o2 -fomit-frame-pointer)和Windows(使用MS Visual Studio 2008的速度优化选项C编译器(我认为它的VC 9.0))提供了真实的结果。 最近,我实现了一个新程序,它使用了大量的表查找和类似的东西。 但是,在Linux上使用gcc优化的程序的rdtsc测量总是导致错误的测量(非常少的CPU周期)比我预期的。 在Windows上运行时相同程序的rdtsc测量(使用上面提到的优化和编译器编译)是现实的,并且同意了预期。 我的问题是,有什么方法gcc优化移动volatile组件指令一些产生上述行为的地方? 我的定时器代码如下: #define TIMER_VARS \ uint32 start_lo, start_hi; \ uint32 ticks_lo, ticks_hi #define TIMER_START() \ __asm__ __volatile__ \ (“rdtsc” \ : “=a” (start_lo), “=d” (start_hi) /* a = eax, d = edx*/ \ : /* no input parameters*/ \ : “%ebx”, “%ecx”, “memory”) #define TIMER_STOP() […]
我无法理解GCC内置函数,感到非常困惑。 库函数和内置函数有什么区别? 是否有内置函数可以做但库函数不能做? 我可以编写一个库函数来执行与内置函数printf相同的任务吗? 如何判断输入参数的类型(%f,float还是double)? GCC内置函数的机器指令不存储在库中,对吧? 他们在哪? 在进行链接时,如何控制这些内置function代码的放置位置? 为什么有时我会在进行链接时出现错误消息,例如“未定义引用__builtin_stdarg_start” // main.c #include int main(void) { printf(“hello world!\n”); return 0; } gcc -c main.c,nm表明main.o中没有符号printf,(只有main(T)和puts(U)),为什么?
该声明: volatile unsigned char * volatile p = (volatile unsigned char * volatile)v; 在MSVC v14.1中生成警告C4197: 警告C4197:’volatile unsigned char * volatile’:忽略强制转换中的顶级volatile 2011 C标准(第[N1570] 6.7.3 4.节)声明:“与限定类型相关联的属性仅对表达式有意义,即l值”,因此此投射中的顶级volatile将被忽略并生成这个警告。 该代码的作者指出,它不违反C标准,并且需要阻止一些GCC优化。 他通过以下代码说明了代码的问题: https : //godbolt.org/g/xP4eGz #include static void memset_s(void * v, size_t n) { volatile unsigned char * p = (volatile unsigned char *)v; for(size_t i = 0; i < n; […]
在给定C文件的情况下,gcc可以吐出所有函数调用的列表,文件名和行号都用于调用本身和函数声明吗? 我知道gcc不知何故用-g(调试器依赖它)保留这些信息,并且它可以使用-dr转储控制流图(但没有文件名或行号); 但是有一个现成的工具,需要gcc输出并做我想要的吗? 我希望这样一个工具使用gcc的原因是,这将允许我将它与大多数基于gcc的软件一起使用的标准构建系统一起使用(例如./configure && make),即使在依赖于他们自己的预处理器的工具的情况下也是如此和/或解析器是一个很大的麻烦。我已经知道了几个这样的工具,例如ctags。 所以这个问题是问题525899的后续问题 。
gcc提供-I-选项,在-I-之前的-I目录中搜索引用的包含( #include “foo.h” ),并在-I-之后的-I目录中搜索括号内的包含( #include ),以及其他引用后的内容。 -I-有另一个非常重要的影响。 它从默认搜索路径中删除#include所在的源文件的目录。 通常,带引号的include总是搜索源文件的目录,并在任何-I或其他目录之前搜索它。 -I-因此允许您按照所需顺序指定引用包含文件的确切位置,方法是删除原则上优先使用的默认路径。 所以听起来我回答了我的问题,是吗? 不。当我使用-I- ,我得到了这个讨厌的图: cc1: note: obsolete option -I- used, please use -iquote instead 问题是-iquote不会从搜索路径中删除当前目录。 无论我向-iquote提供什么,它仍然总是先搜索。 所以问题是:如何在不使用-I-情况下获得与-I-相同的效果,这已被弃用并最终消失? 阐述: 假设文件的布局如下: srcdir/ configure file1.c file2.c config.h builddir/ Makefile file1.o file2.o config.h libpudding.a 由于各种原因,我们无法从srcdir删除config.h (它将影响其他平台上的构建过程)。 但是,我们希望将zconf.h中的config.h优先zconf.h在srcdir的zconf.h中。 这可以通过GCC的-I-标志来完成,但似乎不可能。 更新的问题: 好吧,似乎GNU CC开发人员弃用了-I- ,但没有提供实现其function的替代方法。 所以我更新的问题是:什么是引起开发人员注意的最有效的方法,以便很有可能-I-是不完美的(我觉得最优选,因为它是一种非常优雅的方式处理指定搜索,更加如此,并且比-iquotexxx更难看,或者提供某种方式从引用的包含搜索路径中删除当前目录?
我#include 但是当我调用strcasestr(src, search); 我得到以下错误消息implicit declaration of function ‘strcasestr’ 。 我怎么编译: gcc-4.6 -Wall -lsqlite3 -lunac -Werror -O2 -o foo.out foo.c如何解决这个问题? 提前致谢。
在制作期间,我发现了一个错误: cc1: warnings being treated as errors somefile.c:200: error: the frame size of 1032 bytes is larger than 1024 bytes 行号指向ac函数的右括号,其具有如下签名: void trace(SomeEnum1 p1, SomeEnum2 p2, char* format, …) { char strBuffer[1024]; … 该函数将一些内容打印到缓冲区中。 任何人都知道这种类型的错误通常意味着什么?
我正在尝试创建一个静态库,以便在我的PHP扩展中使用。 为此,我使用gcc -c file.c -o file.o编译我的.c文件并获取.o文件。 然后我使用ar rcs lib.a *.o将所有编译的对象存档到.a文件中。 执行此操作后,我在编译我的PHP扩展时引用此.a文件,但是我收到以下错误: *** Warning: Linking the shared library .la against the *** static library lib.a is not portable! 如果我使用.o文件而不是.a文件,我得到: *** Warning: Linking the shared library .la against the non-libtool *** objects file1.o file2.o is not portable! 我做错了什么,这样做的正确方法是什么?
通过程序集GCC为我的项目中的C文件生成,我注意到函数不会按照它们在源文件中出现的顺序在汇编中输出。 这次重新排序的目标是什么?GCC使用什么启发式来决定订单? (它只是保存函数的数据结构的工件吗?)这不是-freorder-functions ,因为我没有使用-fprofile-arcs 。
我试图在x86程序集中进行相对跳转,但是我无法让它工作。 似乎由于某种原因,我的跳跃不断被重写为绝对跳跃或其他东西。 我正在尝试做的一个简单的示例程序是: .global main main: jmp 0x4 ret 由于jmp指令长4个字节,相对跳转偏离跳转地址+ 1,因此这应该是一个奇特的无操作。 但是,编译和运行此代码将导致分段错误。 对我来说真正的益智之处在于将其编译到对象级别然后反汇编目标文件显示它看起来像汇编程序正确地执行相对跳转,但是在编译文件之后链接器将其更改为另一种类型的跳转。 例如,如果上面的代码位于名为asmtest.s的文件中: $gcc -c asmtest.s $objdump -D asmtest.o … Some info from objdump 00000000 : 0: e9 00 00 00 00 jmp 5 5: c3 ret 这看起来像汇编程序正确地进行了相对跳转,尽管jmp指令填充为0是可疑的。 然后我使用gcc链接它,然后反汇编它得到了这个: $gcc -o asmtest asmtest.o $objdump -d asmtest …Extra info and other disassembled functions 08048394 : […]