Tag: gcc

使用gcc时,为什么在Linux和Windows上打包结构的大小会有所不同?

在下面的代码中,为什么在使用gcc编译时,在Linux和Windows上打包结构的大小是不同的? #include #include // id3 header from an mp3 file struct header { uint8_t version[ 2 ]; uint8_t flags; uint32_t size; } __attribute__((packed)); int main( int argc, char **argv ) { printf( “%u\n”, (unsigned int)sizeof( header ) ); return 0; } 使用的gcc版本: $ g++ –version g++ (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2 $ x86_64-w64-mingw32-g++ –version x86_64-w64-mingw32-g++ (GCC) 4.7.0 […]

使用gcc禁止默认库路径

有没有办法用gcc禁止默认的库路径搜索? -nostdinc为包含路径搜索执行此操作,但是-nostdlib (通过省略或设计)仅禁止-lc -lgcc等但不禁止库搜索路径。

是GCC的选择-O2打破这个小程序还是我有未定义的行为

我在一个非常大的应用程序中发现了这个问题,从中做了一个SSCCE。 我不知道代码是否有未定义的行为或-O2打破它。 用gcc ac -o a.exe -O2 -Wall -Wextra -Werror编译它时会输出5 。 但是在没有-O2 (例如-O1 )的情况下编译时会打印25 ,或者在2个注释行中取消注释(防止内联)。 #include #include // __attribute__((noinline)) int f(int* todos, int input) { int* cur = todos-1; // fixes the ++ at the beginning of the loop int result = input; while(1) { cur++; int ch = *cur; // printf(“(%i)\n”, ch); switch(ch) { […]

自动为C / C ++可执行文件生成目标文件(链接器)依赖项

我目前正在开发一个灵活的C / C ++构建框架,我很快就会(希望)开源。 (有关背景,请参阅此问题)。 我使用以下命令为源/头文件生成#include文件依赖项。 gcc -M -MM -MF 有没有一种巧妙地推断可执行文件的链接器(.o文件)依赖关系(unit testing+在我的情况下为目标平台的主要可执行文件)使用gcc / GNU实用程序以类似的方式? 目前,该框架做了很多假设,并且在确定这些依赖关系时非常愚蠢。 我听说过一种方法,其中nm命令可用于在目标文件中提供未定义符号的列表。 例如,在目标文件上运行nm(使用gcc -c编译)会出现类似这样的内容 – nm -o module.o module.o: U _undefinedSymbol1 module.o: U _undefinedSymbol2 module.o:0000386f T _definedSymbol 然后,人们将查找其他目标文件,其中定义了这些未定义的符号,以提供成功链接文件所需的目标文件依赖性列表。 这是确定可执行文件的链接器依赖性的最佳实践吗? 有没有其他方法可以推断出这些依赖关系? 在提出解决方案时,假设所有目标文件已经存在(即已经使用gcc -c编译)。

GCC源代码中的C语法

我正在寻找GCC源代码中的C语法,更具体地说是yacc / bisonforms的语法。

如何充分利用堆栈跟踪(来自内核或核心转储)?

如果你的内核模块崩溃很幸运,你会得到一个带有大量信息的日志,例如寄存器中的值等。一个这样的信息是堆栈跟踪(核心转储也是如此,但我最初问这个内核模块)。 举个例子: [] ? skink_free_devices+0x32/0xb0 [skin_kernel] [] ? cleanup_module+0x1e5/0x550 [skin_kernel] [] ? __stop_machine+0x57/0x70 [] ? __try_stop_module+0x0/0x30 [] ? sys_delete_module+0x149/0x210 [] ? sysenter_do_call+0x12/0x16 我的猜测是+/与发生错误的函数的偏移量有关。 也就是说,通过检查这个数字,或许可以查看汇编输出,我应该能够找到发生此错误的行(更好的是,指令)。 那是对的吗? 我的问题是,这两个数字究竟是什么? 你如何利用它们?

剥离符号的最佳方法

上周我发布了一个应用程序的Linux和Windows版本。 在发布之后,我们意识到符号没有被剥离,我的经理认为(我不同意)它可能允许用户理解我们的算法。 无论如何,现在,我将不得不清理符号并重新发布应用程序。 我的问题, 在Linux中剥离符号的最佳方法是什么? 在Windows中删除符号的最佳方法是什么?

替代-pg与Clang?

我想分析CPU(如果可能的样本),尽可能小的性能影响(因此类似于GCC的-pg ),用Clang编译的二进制文件。 是否有替代方法使用代码检测,或产生类似于gprof的输出?

无法计算大于20的阶乘! ! 怎么办?

我使用无符号长整数格式来计算大因子。 但是我的代码在某些时候失败了你能看一下吗? 实际上它是指数函数的泰勒展开的更大代码的一部分,但是这一部分在这一点上是无关紧要的。 我将不胜感激任何建议。 谢谢 #include #include //We need to write a factorial function beforehand, since we //have factorial in the denominators. //Remembering that factorials are defined for integers; it is //possible to define factorials of non-integer numbers using //Gamma Function but we will omit that. //We first declare the factorial function as follows: unsigned […]

gcc能准确捕捉到无用的条件吗?

请检查以下代码: if (foo->bar == NULL); foo->bar = strdup(“Unknown”); 我花了三个小时的最后一部分用Valgrind追捕那个泄漏,当我发现这个假的时候感觉非常愚蠢’;’。 我知道上面的代码是有效的C,但是我希望gcc能够告诉我是否使用条件作为语句。 有没有我可以通过的旗帜,这将有助于在未来发现这种类型的错误? 在我看来,gcc能够知道条件是否无用。 IE : if (1 == 1); code_that_is_always_reached_since_conditional_is_a_statement(); 这些棉绒也没有问题。 Valgrind非常适合找到这些类型的东西..但是泄漏实际上比代码最初分配的位置要晚得多。 任何帮助都表示赞赏,甚至“不,它不会那样做”。 编辑: 哇,谢谢你这么快速的回复! 总结一下,这是您的选择: -Wextra接受了各种各样的东西 – 墙没有,包括空/无用的陈述。 -wempty-body接收无用语句,由-Wextra启用(但可以破坏旧版本的gcc,适用于4.3.x) 有些人可能会发现-Wextra很烦人。 您可能会对不同签名的类型进行比较,但您知道只有在它们相同时才会进行比较。 即 int ret; unsigned int i; ret = foo(bar); /* foo() is known to return a signed errno on failure */ if (ret < […]