想要查看某些C代码的编译器输出(在汇编中),我在C中编写了一个简单的程序,并使用gcc生成了它的汇编文件。 代码是这样的: #include int main() { int i = 0; if ( i == 0 ) { printf(“testing\n”); } return 0; } 它生成的程序集在这里(只有主函数): _main: pushl %ebpz movl %esp, %ebp subl $24, %esp andl $-16, %esp movl $0, %eax addl $15, %eax addl $15, %eax shrl $4, %eax sall $4, %eax movl %eax, -8(%ebp) movl -8(%ebp), […]
我有一个性能依赖于rotate-left指令的程序。 在MSVC下,它运行得相当好,只需将_rotl()内在函数定义为向左旋转的目标。 在GCC for Linux下,它也运行良好。 这里足以定义等效的软件构造rotl32(x,r) = ((x <> (32 – r))) ,编译器足够聪明地认识到这是一个32位向左旋转,并自动将其替换为其内在等价物(公平地说,MSVC也能够进行此类检测)。 在MinGW下,不是那么多。 当MinGW使用GCC时,这就更有趣了。 MinGW可以编译windows内部_rotl ,但是没有明显触发相应的内在函数。 软件版本似乎也未被发现,尽管公平地说,它仍然比_rotl快。 最终结果是性能降低了10倍,所以它绝对是重要的。 注意:测试的MinGW的GCC版本是4.6.2
我试图在PintOS makefile上运行make,但我一直得到未定义的引用“floor”错误。 makefile在下面。 我用gcc 4.6.1运行Ubuntu 11.10。 任何帮助表示赞赏。 all: setitimer-helper squish-pty squish-unix CC = gcc CFLAGS = -Wall -W LDFLAGS = -lm setitimer-helper: setitimer-helper.o squish-pty: squish-pty.o squish-unix: squish-unix.o clean: rm -f *.o setitimer-helper squish-pty squish-unix 〜
我正在为PIC32MX编写C语言,使用Microchip的PIC32 C编译器(基于GCC 3.4)编译。 添加我以下的标准是GNU99(带GNU扩展的C99,编译器标志-std=gnu99 ) 我的问题是:我有一些可重新编程的数字数据存储在EEPROM或芯片的程序闪存中。 这意味着当我想存储浮动时,我必须做一些类型的惩罚: typedef union { int intval; float floatval; } IntFloat; unsigned int float_as_int(float fval) { IntFloat intf; intf.floatval = fval; return intf.intval; } // Stores an int of data in whatever storage we’re using void StoreInt(unsigned int data, unsigned int address); void StoreFPVal(float data, unsigned int address) { StoreInt(float_as_int(data), […]
是否有任何C编译器具有扩展以按列主要顺序存储数组而不是标准行主要顺序?
如果我用“-L”编译我的源代码。 可以找到动态库libmd5.so。 gcc main.c -g -O2 -Wall -o main -L. -lmd5 -lcr 但是如果我离开“-L。” – 选项,链接器就找不到动态库。 如何在不调用“-L”的情况下进行更改? (附加信息libmd5.so和libmd5.so.1.0.1位于/ home / user / ba)
我在“黑客:剥削的艺术”一书中有一个例子,我对这本书的结果有所不同。 似乎示例中的strcpy()函数编译为如下指令: 0x802384c5 : call 0x80482C4 而当我编译相同的程序时,它会删除对库的调用,并用一系列mov指令替换它: 0x8048475 : mov DWORD PTR [eax],0x6c6c6548 0x804847b : mov DWORD PTR [eax+0x4],0x6f57206f 0x8048482 : mov DWORD PTR [eax+0x8],0x21646c72 0x8048489 : mov WORD PTR [eax+0xc],0xa 我知道编译器可以进行各种优化,但即使它是默认值,我甚至尝试用-O0编译它,这应该是为了防止优化。 如何编译代码以便引用外部库? 自从大学以来,我没有做任何C或组装,所以请对我温柔:)
我正在使用GCC 4.8.1,它似乎没有将const变量本地存储在DATA段中的main。 下面是3个这样的程序的代码和内存映射: 代码1: int main(void) { //char a[10]=”HELLO”; //1 //const char a[10] = “HELLO”; //2 return 0; } MEMORY MAP FOR ABOVE: text data bss dec hex filename 7264 1688 1040 9992 2708 a.exe 代码2: int main(void) { char a[10]=”HELLO”; //const char a[10] = “HELLO”; return 0; } MEMORY MAP FOR 2: text data […]
我正在开发一些有限时间运行裸机的软件,直到Linux端口准备好进入黄金时段。 该软件正在与uClibc链接,uClibc提供了malloc,clock_gettime等的实现,但问题是它们都依赖于系统调用,因为我们还没有内核来处理它们,因此只会陷阱硬件。 我一直在使用别名来覆盖我们需要的函数,即our_mem.c: void* our_malloc(size_t size) { .. } void* malloc(size_t size) __attribute__ ((malloc, weak, alias(“our_malloc”))); 问题是,这似乎有点随机。 我可以有一个构建,其中所有调用都是正确的别名,在下一个构建中,我在一个不相关的文件中修改了它,它突然工作到一个点,然后其中一个调用转到uClibc malloc。 起初我认为这是链接顺序的问题,但构建系统始终以相同的顺序链接,同一个调用将在一个构建中工作,并在下一个构建中失败。 二进制文件(显然)是静态链接的。 我不确定这究竟是如何使用别名的,因为我没有找到很多关于它的文档但我几年前在malloc和朋友(也使用uClibc)上成功使用了这种技术然后它一直工作。
可能重复: 为什么gcc在其所有错误消息中都有“â”? C编程的新手,我正在使用GCC。 我注意到海湾合作委员会的许多“帽子”输出,如果这种情况持续下去,我开始觉得我可能会错过一些重要的信息。 例如: /usr/include/gconv.h:72: error: expected declaration specifiers or â before â /usr/include/gconv.h:174: error: expected specifier-qualifier-list before â /usr/include/libio.h:486: error: expected â, â, â, â or â before â /usr/include/stdio.h:308: error: expected declaration specifiers or â before â /usr/include/stdio.h:610: error: expected â, â, â, â or â before â DATA_a.txt: In function â: […]