Tag: gcc

GCC的代码覆盖选项如何工作?

请考虑以下命令: gcc -fprofile-arcs -ftest-coverage main.c 它生成要由gcov使用的文件main.gcda,以生成覆盖率分析。 那么main.gcda是如何生成的? 仪器如何完成? 我可以看到检测代码吗?

GCC中-O0和-O1之间的差异

编译一些代码时,我注意到在-O0和-O1之间创建的汇编程序存在很大差异。 我想要启动启用/禁用优化,直到我发现导致汇编程序发生某些变化的原因。 如果我使用-fverbose-asm来确切地找出O1与O0相比启用了哪些标志,然后手动禁用它们,为什么生成的汇编程序仍然如此大不同? 即使我用O0运行gcc并手动添加fverbose-asm所说的用O1启用的所有标志,我也没有得到与使用O1时相同的汇编程序。 除了’-f …’和’-m ……’之外还有什么可以改变的吗? 或者只是’O1’与无法关闭的’O0’相比具有一定的魔力。 对于含糊不清的内容感到抱歉 – 这与使用GCC + ARM减少递归期间的堆栈使用有关,但是提及它使问题有点难以理解。

告诉gcc函数调用不会返回

我在GCC下使用C99 。 我有一个函数在头文件中声明为static inline ,我无法修改。 函数永远不会返回,但未标记为__attribute__((noreturn)) 。 如何以告诉编译器不会返回的方式调用该函数? 我从我自己的noreturn函数调用它,部分想要抑制“noreturn函数返回”警告但也想帮助优化器等。 我已尝试在属性中包含声明,但会收到有关重复声明的警告。 我已经尝试创建一个函数指针并将该属性应用于该函数,但它表示函数属性不能应用于指向函数。

在文本段中创建具有给定大小的C函数

我正在编写一个嵌入式powerpc 32系统,它带有一个32 KB的8路组关联L2指令缓存。 为了避免高速缓存抖动,我们以一种方式对齐函数,使得以高频率调用的一组函数的文本(想想中断代码)最终在单独的高速缓存集中。 我们通过根据需要插入虚函数来实现这一点,例如 void high_freq1(void) { … } void dummy(void) { __asm__(/* Silly opcodes to fill ~100 to ~1000 bytes of text segment */); } void high_freq2(void) { … } 这让我感到丑陋和不理想。 我想做的是 完全避免使用__asm__并使用纯C89(可能是C99) 找到一种方法来创建GCC优化器不接触的所需的dummy()间隔 dummy() spacer的大小应该可以配置为4个字节的倍数。 典型的间隔物为260至1000个字节。 对于总共500个函数中的一组约50个函数应该是可行的 我也愿意探索以一种方式放置一组选定函数的全新技术,这样它们就不会映射到相同的缓存行。 链接器脚本可以这样做吗?

在Windows中使用cygwin编译的C程序,在Linux下进行分段故障。 cygwin GCC’糟糕’吗?

对于我的Programming 102类,我们被要求提供在Linux下编译和运行的C代码。 我的硬盘驱动器上没有足够的空间来安装Linux和Windows,因此我使用cygwin来编译我的程序。 我必须提供的最新程序编译并在cygwin下正常运行。 它在Linux下编译很好,但执行中途会产生分段错误。 我向给我们上课的研究生解释了这一点,他说cygwin的GCC版本允许编写和执行更粗糙的代码。 我通过谷歌找到的少数参考文献尚无定论。 我发现一个线程说Linux下的seg故障原因是内存泄漏。 为什么这不会影响cygwin版本? 我会使用大学的计算机,但我不能在他们身上使用Subversion,这会严重阻碍我的努力。 (我是编码的新手,通常需要能够恢复到X修订版)。 cygwin的GCC版本是否真的对它编译的代码更“松懈”? 如果是这样,编码时是否有任何明显的问题需要注意? 是否有任何替代方法可以编写将在Linux下运行的代码? 编辑 谢谢你的回复。 我在原帖中没有明确说明:我的代码中有一个错误,对我来说非常重要(我对编程很陌生,毕竟在C语言中真的很绿)。 我的TA暗示cygwin的GCC是一个不太可靠的编译器 – 比起在GNU / Linux下发现的代码要运行得更多。 我发现这很奇怪,因此在互联网上搜索,但实际上找不到任何对这个事实的引用。 除了责怪编译器与我的代码之外,我想知道程序在Windows下运行并在Linux下崩溃的原因是什么。 回复:在这方面说明了Windows / Linux下的不同内存管理器和堆/堆栈布局。 结论是cygwin的GCC和GNU / Linux一样’好’,它是底层操作系统/纯粹的运气,我的错误程序在一个而不是另一个下运行是非常正确的吗? 关于发布源代码,这是一个家庭作业,所以我更愿意自己找到问题,如果可能的话:) 编辑2 我接受了jalf的答案,因为它谈到了什么使程序在Windows下而不是在Linux下运行,这是我真正想知道的。 感谢所有贡献的人,他们都是非常有趣和内容丰富的回复。 当我发现问题并修复它时,我会上传一个包含这个非工作版本的所有源代码的zip文件,万一有人好奇地看到我到底做了什么:) 编辑3 对于那些有兴趣看到代码的人,我发现了问题,这确实是由于指针。 我试图从函数返回一个指针。 我试图返回的指针在函数内部被声明,因此在执行函数后被销毁。 问题代码在第22-24行注释掉。 随意嘲笑我的代码。 /** * Returns array of valid searches based on current coordinate */ void determine_searches(int […]

我可以用gcc编译一个函数然后用clang吗?

我试图使用SSE4.2内部函数与clang / llvm,但它没有编译,因为我得到cannot select intrinsic从LLVM中cannot select intrinsic错误。 另一方面,相同的代码在gcc中完美地编译。 所以我想,也许我可以使用gcc编译该函数,以便拥有一个对象或库文件,然后在我的代码中调用该库函数,该函数由clang / llvm编译。 那会有用吗?

在gcc中使用-g和-O2选项

有没有人经历混合-g(调试符号)和-O2(最佳安全优化)与gcc编译器? 我必须调试分发给最终用户的发布程序的崩溃,这些程序可以将我发回核心文件。 我一直习惯称: gdb <> <> 并看看问题出在哪里。 现在我可以看到调用跟踪但没有调试符号我遇到了麻烦。 任何的想法?

为什么需要一个明确的`-lm`编译器选项

可能重复: gcc:为什么链接数学库需要-lm标志? 一般来说,除了包含头文件math.h之外,为了使用任何数学函数,您必须使用链接器选项-lm进行链接。 -l这里将指代用于搜索特定库libm.o的链接器选项。 我的问题是 为什么GCC默认不包含此库? 是因为库大量使用数学协处理器,它需要添加额外的代码来初始化浮点初始化(我可能在这里使用了错误的术语)? 注意 我刚刚查看了http://stackoverflow.com链接中提到的所有答案。 这对我来说没什么意义。 归因于三个基本原因 保证标准库可用。 链接其他posix库(如pthread)明确有意义,但为什么我们必须为标准库做一个显式链接。 即使是历史原因也不是很清楚。 为什么libm与libc分开? 为什么我们仍然在最近的gcc编译器中inheritance这些行为? 它有什么简单性? 这是我测试的,没有libm和libm。 没有libm的那个,我已经写了我自己的Pow版本 这是一个例子 abhibhat@abhibhat-VirtualBox:~/Projects/GIPL6_2$ ls -1 Test_*|xargs -I{} sh -c “echo {} && echo “—————–” && cat {}” Test_withlibm.c —————– #include #include int main() { int i=20; double output1=pow(2.618033988749895,i); return 0; } Test_withoutlibm.c —————– #include #include double Pow(double […]

让编译器检查数组初始值设定项的数量

初始化一个数组(在C ++中,但任何适用于C的解决方案也可能在这里工作)使用较少的初始化器而不是元素是完全合法的: int array[10] = { 1, 2, 3 }; 但是,这可能是一些模糊的错误。 有没有办法让编译器(gcc)检查一个特定数组的初始值设定项的数量,如果声明和实际大小不匹配,则发出警告甚至错误? 我知道我可以使用int array[] = { 1, 2, 3 }; 然后可以使用涉及sizeof(array)静态断言来validation我的期望。 但我在其他翻译单元中使用array ,所以我必须用明确的大小声明它。 所以这个技巧对我不起作用。

包装结构(gcc)去

我有一些旧的C代码,有点大量使用打包结构。 我正在考虑使用Go作为此代码的包装器,但是很难找到传递或甚至为这些结构编写定义的方法。 例: import “unsafe”; type AlignTest struct { c byte; y int16; z int16; q int32; } func main() { vr := new(AlignTest); fmt.Println(unsafe.Sizeof(*vr), “\n”); } 使用打包/未对齐的结构返回12而不是1 + 2 + 2 + 4 = 9。 我知道我可以创建一个字节数组并手动进行解析,但这看起来非常脆弱且容易出错……