我正在尝试使用C API构建Python模块/扩展写入,但它失败了: % python2 cmath.py build running build running build_ext building ‘c_math’ extension creating build creating build/temp.linux-x86_64-2.7 gcc -pthread -fno-strict-aliasing -march=x86-64 -mtune=generic -O2 -pipe -fstack-protector –param=ssp-buffer-size=4 -D_FORTIFY_SOURCE=2 -DNDEBUG -march=x86-64 -mtune=generic -O2 -pipe -fstack-protector –param=ssp-buffer-size=4 -D_FORTIFY_SOURCE=2 -fPIC -I/usr/include/python2.7 -c c_math.c -o build/temp.linux-x86_64-2.7/c_math.o c_math.c:18:5: warning: initialization from incompatible pointer type [enabled by default] {“more”, c_math_more, METH_VARARGS, “n […]
我看到很多关于gdb的教程要求在编译c程序时使用-g选项。 我无法理解-g选项实际上做了什么。
如果你有一个简单的C程序,比如 int main(void) {return 0;} 它可以使用gcc -o test test.c编译。 据我所知,gcc执行编译,组装然后链接。 后两个步骤是通过运行as和ld来实现的。 我可以使用gcc -S test.c生成汇编代码。 你会在终端中键入什么,将汇编代码转换为可执行文件? (这样做的原因是学习assembly)
我很难理解角色约束在GCC内联汇编(x86)中的作用。 我已经阅读了手册 ,它准确地解释了每个约束的作用。 问题在于,即使我理解每个约束的作用,但我很少理解为什么要使用一个约束而不是另一个约束,或者含义可能是什么。 我意识到这是一个非常广泛的话题,所以一个小例子应该有助于缩小焦点。 以下是一个简单的asm例程,它只添加两个数字。 如果发生整数溢出,则将值1写入输出C变量。 int32_t a = 10, b = 5; int32_t c = 0; // overflow flag __asm__ ( “addl %2,%3;” // Do a + b (the result goes into b) “jno 0f;” // Jump ahead if an overflow occurred “movl $1, %1;” // Copy 1 into c “0:” // We’re […]
我希望我的exception处理程序和调试函数能够打印调用堆栈回溯,基本上就像glibc中的backtrace()库函数一样。 不幸的是,我的C库(Newlib)没有提供这样的调用。 我有这样的事情: #include // GCC’s internal unwinder, part of libgcc _Unwind_Reason_Code trace_fcn(_Unwind_Context *ctx, void *d) { int *depth = (int*)d; printf(“\t#%d: program counter at %08x\n”, *depth, _Unwind_GetIP(ctx)); (*depth)++; return _URC_NO_REASON; } void print_backtrace_here() { int depth = 0; _Unwind_Backtrace(&trace_fcn, &depth); } 这基本上有效,但结果痕迹并不总是完整的。 例如,如果我这样做 int func3() { print_backtrace_here(); return 0; } int func2() { return […]
我正在尝试编译一个简单的C程序(Win7 32位,Mingw32 Shell和GCC 5.3.0)。 C代码是这样的: #include #include #define _set_tssldt_desc(n,addr,type) \ __asm__ (“movw $104,%1\n\t” \ :\ :”a” (addr),\ “m” (*(n)),\ “m” (*(n+2)),\ “m” (*(n+4)),\ “m” (*(n+5)),\ “m” (*(n+6)),\ “m” (*(n+7))\ ) #define set_tss_desc(n,addr) _set_tssldt_desc(((char *) (n)),addr,”0x89″) char *n; char *addr; int main(void) { char *n = (char *)malloc(100*sizeof(int)); char *addr = (char *)malloc(100*sizeof(int)); set_tss_desc(n, addr); free(n); […]
在GCC中进行全面优化的“发布模式”中需要构建哪些具体选项? 如果有多个选项,请列出所有选项。 谢谢。
在回答另一个问题时,我对此感到好奇。 我很清楚 if( __builtin_expect( !!a, 0 ) ) { // not likely } else { // quite likely } 通过做一些暗示处理器/改变汇编代码顺序/某种魔术的东西,将使“非常可能”的分支更快(通常)。 (如果有人能澄清那个也很棒的魔法)。 但这是否适用于a)内联ifs,b)变量和c)除0和1以外的值? 即会 __builtin_expect( !!a, 0 ) ? /* unlikely */ : /* likely */; 要么 int x = __builtin_expect( t / 10, 7 ); if( x == 7 ) { // likely } else […]
在我使用的几个编译器(所有gcc但各种版本)上,我得到一个C99 mode错误,比如在for循环表达式中而不是在它之前声明int i (如果我不使用std=c99选项)。 在这里阅读后我明白了gcc选项-ansi , -std=c89和-std=iso9899:1990都符合ANSI C标准, 但我不明白为什么/如果我应该选择c89标准而不是更新标准如c99 (这是我假设的最新版本)。 此外,我看到C语言的iso类型标准的多个版本,其中第一个(根据我的理解)是ANSI标准的直接端口。 是否可以说iso将更新其C标准,但C的原始ANSI标准将始终相同? 奖金问题: 我实际上可以自己弄清楚这个,我还没有花时间去做,所以如果有人知道他们的头顶那么这很好,否则没什么大不了的,我会在以后想出来的:) 我有一本相当新The C Programming Language (ANSI) 。 我的书总是显示如下循环: int i; for(i = 0; i < foo; i++) 但很多人(他们的小指中有大多数编程人才)都会像这样编写for循环: (int i = 0; i < foo; i++) 如果我以第一种方式编写循环然后i应该可以访问整个函数是正确的,但如果我以第二种方式编写它,那么i只能访问for循环REGARDLESS我编译的标准是什么? 另一种问同样问题的方法,如果我使用c89标准进行编译,那么两个for循环的i都可以被整个函数访问,如果我用c99标准编译,那么第一个for循环的i可以被整个函数访问而第二个for循环的i只能通过for循环访问?
我得到了多重的字符串文字 char* a1 = “apalaxia”; char* t = “apalaxia”; char* zzzz = “apalaxia”; 跨编译单元/ .o文件 我强烈要求所有它们在一个运行时地址下合并(因此所有它们都有一个char *值) 如何在GCC中进行(在c ++模式下)? 我尝试了-fmerge-constants和-fmerge-all-constants但是id不合并