Tag: gcc

为什么malloc分配的字节数与请求的数量不同?

我有这段代码 #include #include #include #include int main(){ void *a, *b; a = malloc(16); b = malloc(16); printf(“\n block size (for a): %p-%p : %li”, b, a, ba); a = malloc(1024); b = malloc(1024); printf(“\n block size (for a): %p-%p : %li”, b, a, ba); } 这不应该打印最后分配的块大小(16或1024)? 它反而打印24和1032,因此分配的内存量似乎有8个额外的字节。 我的问题是(在进行这个测试用例之前)我在一个函数(1024字节)中执行malloc() ),并返回分配的结果。 在函数返回时检查块大小时,我得到了516个块……我不明白为什么。 我想这可能是在对分配的缓冲区进行一些处理后发生内存损坏的原因:) 编辑:我已经看过如何从C中的指针获取数组的大小? 似乎问了同样的事情,抱歉重新发布。 我已将我的示例重新编写为更具体的代码: #include […]

在编译和链接C代码时,为什么在某些情况下不需要-lm?

我这里有一个示例文件: #include #include int main(){ printf(“%f\n”, log(10)); } 当我用gcc sample.c -oa编译它时它工作得很好。 我可以使用./a运行它,它会产生预期的输出2.302585 。 然而,当我的文件看起来像这样: #include #include int main(){ double a = 10; printf(“%f\n”, log(a)); } 它不能用gcc sample.c -oa编译。 相反,我必须使用gcc sample.c -oa -lm这样我才能显然告诉它“链接数学”…这就是我没有真正遵循的地方,为什么我不必在第一次链接数学例? 它究竟是什么意思必须“链接数学”? 自从我使用C编译器以来已经有一段时间了,所以如果这是一个糟糕的问题,请原谅我。

Mac OS上的混合静态和动态链接

我想使用gcc生成一个共享库,但我想链接一些静态依赖的其他库。 现在生成我使用的“标准”动态链接输出文件 gcc -dynamiclib *.o -lfoo -lbar -o outfile 这将是 gcc -shared *.o -lfoo -lbar -o outfile 在Linux系统上的binutils ld 。 现在,如果我想将libfoo和libbar静态链接,我可以直接命名静态库 gcc -dynamiclib *.o /usr/lib/libfoo.a /usr/lib/libbar.a -o outfile 但是,这样我必须自己寻找库文件。 GNU binutils ld支持这个: gcc -shared *.o -l:libfoo.a -l:libbar.a -o outfile 但是苹果公​​司没有。 有没有办法让苹果的ld自己寻找静态库? 如果没有,是否有另一种方法可以避免命名存档的确切位置,例如从需要libfoo的目标文件和带有-static开关的libbar生成中间输出文件,并将该文件与剩余的对象文件链接在一起以创建动态对象?

在Linux内核中使用修饰符“P”和约束“p”超过“m”的gcc内联汇编

我正在阅读Linux内核源代码(3.12.5 x86_64)以了解如何处理进程描述符。 我发现获取当前进程描述符我可以使用current_thread_info()函数,其实现如下: static inline struct thread_info *current_thread_info(void) { struct thread_info *ti; ti = (void *)(this_cpu_read_stable(kernel_stack) + KERNEL_STACK_OFFSET – THREAD_SIZE); return ti; } 然后我查看了this_cpu_read_stable() : #define this_cpu_read_stable(var) percpu_from_op(“mov”, var, “p” (&(var))) #define percpu_from_op(op, var, constraint) \ ({ \ typeof(var) pfo_ret__; \ switch (sizeof(var)) { \ … case 8: \ asm(op “q “__percpu_arg(1)”,%0″ \ : “=r” […]

如何在gcc中禁用尾调优化

想知道是否有人知道gcc禁用尾调优化的标志。 基本上在尾调用优化中,当被调用函数的返回值通过(通过返回)或函数中没有其他任何内容发生时,gcc将替换堆栈帧。 也就是说,在 void main() { foo(); } void foo() { bar(); } void bar() { /* at this point in code, the foo() stack frame no longer exists! */ } 当foo调用bar时,gcc会发出代替foo的堆栈帧的代码,而不是添加新的堆栈帧。 我公司有一个堆栈展开器,可以从代码中的任何一点打印出堆栈跟踪。 tailcall优化使堆栈帧消失,这可能会在一定程度上混淆堆栈跟踪。 我正在使用gcc4.3编译x86-64。 提前致谢! P

GDB说“没有符号表”,但nm显示文件有调试符号

我正在尝试使用GDB调试一个简单的C项目,但无论我如何编译它,GDB似乎都找不到该程序的调试符号。 当我将程序加载到GDB时,它声称已成功读取符号,因为它打印 Reading symbols from /home/edward/…done. 但是,当我运行程序时,打破分段错误,并输入info locals ,它说 No symbol table info available. 另外, bt表明执行在我写的函数(不是系统或库调用)中停止,但是没有行号信息,只有原始内存地址。 为什么GDB不能找到或使用之前成功读取的符号? 我在我正在运行的二进制文件上运行nm和objdump ,它们都显示了.debug_info , .debug_line等部分,因此该文件确实包含调试符号。 我通常使用Makefile编译,设置以下标志: CFLAGS = -mno-red-zone -fno-omit-frame-pointer -ggdb -O0 -I. -Wdeclaration-after-statement -Wall 当我调用gcc时,我可以看到它被使用。 但是,我尝试更改为-g ,并通过在简单的测试文件上调用gcc -g -O0手动编译,结果仍然相同:二进制文件包含调试符号,GDB读取它们,但调用任何GDB命令都会产生一条消息,指出调试信息不​​可用。 更新 我正在运行Ubuntu 12.04,我的GDB版本是7.4,而我的GCC版本是4.8.1。 如果我在GDB中set complaints 10000然后加载文件,它会打印以下投诉: Reading symbols from /home/edward//minithread… DW_AT_low_pc 0x400690 is not < DW_AT_high_pc 0x33 for DIE […]

C中的函数式编程(Currying)/类型问题

作为一个染成羊毛的function性程序员,我发现很难不把我最喜欢的范例变成我正在使用的语言。 在编写一些CI时,我想要讨论我的一个函数,然后传递部分应用的函数。 看完之后有没有办法在C里做cur? 并注意到http://gcc.gnu.org/onlinedocs/gcc/Nested-Functions.html#Nested-Functions上的警告我提出: #include typedef int (*function) (int); function g (int a) { int f (int b) { return a+b; } return f; } int f1(function f){ return f(1);} int main () { printf (“(g(2))(1)=%d\n”,f1(g(2))); } 哪个按预期运行。 但是,我的原始程序使用double s,所以我想我只是改变了适当的类型,我会没事的: #include typedef double (*function) (double); function g (double a) { double f (double b) { […]

为什么C不允许从char **到const char * const *(和C ++)的隐式转换?

我知道从char **到const char **隐式转换无法完成,为什么,以及转换为char *const *工作原理。 请参阅底部以获取有关该说明的链接。 除了一件特别的事情,这一切都是有道理的。 所以我有以下代码: #include void print(const char *const*param) { printf(“%s\n”, param[0]); } int main(int argc, char **argv) { print(argv); return 0; } 如果我将其编译为C ++代码,它编译得非常好。 但是,如果相同的代码只编译为C代码,我会收到一个错误(好吧,警告,但我们假设 – -Werror , -Werror警告视为错误)。 GCC: test.c: In function ‘main’: test.c:12:11: warning: passing argument 1 of ‘print’ from incompatible pointer type [-Wincompatible-pointer-types] print(argv); ^ test.c:4:1: […]

执行__builtin_clz

GCC(4.6+)__builtin_clz的实施是什么? 它是否与Intel x86_64 (AVX)上的某些CPU指令相对应?

我可以通过链接静态库来构建共享库吗?

我有一堆静态库(* .a),我想构建一个共享库(* .so)来链接这些静态库(* .a)。 我怎么能用gcc / g ++这样做?