Tag: gcc

目标文件“Version References”来自哪里?

目前我在一个目录中有一个文件libshared-object.so (名称已更改为通用性)。 当我跑 $ objdump -p libshared-object.so 我收到以下输出: libshared-object.so: file format elf64-x86-64 Program Header: LOAD off 0x0000000000000000 vaddr 0x0000000000000000 paddr 0x0000000000000000 align 2**21 filesz 0x00000000000828ee memsz 0x00000000000828ee flags rx LOAD off 0x0000000000083768 vaddr 0x0000000000283768 paddr 0x0000000000283768 align 2**21 filesz 0x00000000000048e0 memsz 0x0000000000004af0 flags rw- DYNAMIC off 0x0000000000084af0 vaddr 0x0000000000284af0 paddr 0x0000000000284af0 align 2**3 filesz 0x00000000000002a0 […]

在Mac OS X 10.6.8上的gcc-4.2.1中不存在strnlen – 如何定义它?

我正在构建最新的dcraw.c的跨平台OS X版本。我在OS X 10.6.8上执行此操作以获得PPC兼容性。 现在我的问题是strnlen似乎在最新版本的程序中使用,它在10.6.8上不存在,gcc给我这样的消息: Undefined symbols for architecture i386: “_strnlen”, referenced from: … Undefined symbols for architecture ppc: “_strnlen”, referenced from: … 所以,我想定义strnlen但不太清楚如何。 问:任何人都可以在dcraw.c中提供strnlen的工作定义吗? 我的gcc编译命令是这个btw: gcc -o dcraw -O4 -Wall -force_cpusubtype_ALL -mmacosx-version-min=10.4 -arch i386 -arch ppc dcraw.c -lm -DNODEPS

如何逐步看宏扩展?

似乎Eclipse允许用户通过按F2“逐步查看扩展”。 我喜欢这个很棒的function。 但是我可以用gcc或clang (或任何工具)做同样的事情吗? -E选项使所有宏完全展开。 所以我没有找到任何替代方法来逐步扩展宏。 Eclipse很大。 我希望我不需要在任何地方安装它并一直启动它。

C:gcc中的uint16_t减法行为

我试图减去两个无符号整数并将结果与​​有符号整数(或文字)进行比较。 使用unsigned int类型时,行为符合预期。 当使用uint16_t (来自stdint.h )类型时,行为不是我所期望的。 使用gcc 4.5进行比较。 给出以下代码: unsigned int a; unsigned int b; a = 5; b = 20; printf(“%u\n”, (ab) < 10); 输出为0,这是我的预期。 a和b都是无符号的,并且b大于a,因此结果是一个大的无符号数,大于10.现在如果我改变a和b来输入uint16_t: uint16_t a; uint16_t b; a = 5; b = 20; printf(“%u\n”, (ab) < 10); 输出为1.这是为什么? 两个uint16_t类型之间的减法结果是存储在gcc中的int中吗? 如果我将10更改为10U则输出再次为0,这似乎支持这一点(如果减法结果存储为int并且与无符号int进行比较,则减法结果将转换为unsigned int)。

Bitwise Leftshift(<<)奇怪的行为

gcc bitwise Leftshift( << )奇怪的行为。 这是我的代码: #include #include void foo(int n){ printf(“1<<32:%d\n", 1<<32); printf("1<<(32-n):%d\n", 1<<(32-n)); } int main(){ foo(0); } 如果我将0作为参数传递,结果可能会有所不同。 编译源代码: $gcc main.c -o demo -lm -pthread -lgmp -lreadline 2>&1 main.c: In function ‘foo’: main.c:5:3: warning: left shift count >= width of type [enabled by default] 执行程序: $demo 1<<32:0 1<<(32-n):1 这个结果是我从编译在线网站得到的 如果我将0传递给它,如何使foo函数输出0? (目前输出1代替)

#if是否将未定义的符号常量假设为0是标准的?

在这个c程序中 #include int main() { #if UnDefinedSymbolicConstant==0 printf(“UnDefinedSymbolicConstant is equal to 0\n “); #else printf(“UnDefinedSymbolicConstant is not equal to 0\n”); #endif return 0; } UnDefinedSymbolicConstant在任何地方都没有#define ,仍被假定为0并将gcc-4.3.4的输出作为: UnDefinedSymbolicConstant is equal to 0 那么, 这是标准的行为还是只在gcc中才这样?

Makefile vpath不适用于头文件

我试图在我的Makefile中使用vpath,以避免为每个源文件添加目录名前缀。 但我不能让它正常工作。 这是Makefile: CC=gcc -Wall vpath %.h include vpath %.c src all: main.c Event.o Macros.h $(CC) $< Event.o -o test/a.out Event.o: Event.c Event.h Macros.h $(CC) -c $< -o $@ 正确包含src目录。 即,通过gcc找到Event.c文件。 但是Event.h和Macros都没有。 我在gcc中遇到错误,说在编译Event.c时找不到这两个文件。 我尝试一次将C文件中的#include指令更改为其中的每一个。 #include “Event.h” /* doesnt work */ #include /* doesnt work */ #include “../include/Event.h” /* works */ 你能帮帮我解决这个问题吗? 我真的想避免在每个源文件之前使用目录名,因为我的实际Makefile比这大。

关于c中“非法”的优化?

在学习编译器优化时,我在Linux下使用GCC版本gcc version 4.4.5 (Ubuntu/Linaro 4.4.4-14ubuntu5.1)编写代码 为了理解C中not a statement (nop),我先写了两个代码,然后使用gcc -S选项generate their compiled assembly code 。 拳头代码yc desktop:~$ cat yc main() { int i=0; } desktop:~$ gcc -S yc desktop:~$ 第二个代码xc desktop:~$ cat xc main() { int i=0; /* Loops and if*/ while(0); for(;0;); if(0); /* Arithmetic Operations */ i * i; i / i; i […]

如何告诉gcc在struct中禁用填充?

我不确定它是否正常或者它是编译器错误但是我有一个包含很多成员的C结构。 其中包括: struct list { … … const unsigned char nop=0x90; // 27 bytes since the begining of the structure const unsigned char jump=0xeb; // 28 bytes since the begining of the structure const unsigned char hlt=0xf4; // 29 bytes since the begining of the structure unsigned __int128 i=0xeb90eb90eb90eb90f4f4 // should start at the 30th […]

为什么Borland在不同的C文件中使用相同对象的多个定义进行编译,而GCC没有?

我正在研究全局变量的行为。 到目前为止,我认为全局变量的多重定义是非法的方式,必须得到一个错误。 但是我从Borland C / C ++编译器得到了意想不到的结果,而GCC给了我预期的结果。 码: test1.c : #include void func(void); int num=1; void main(){ func(); return; } test2.c : #include int num=2; void func(){ printf(“%d”,num); return; } 在MS-DOS提示符下 Borland C / C ++: c:\test>bcc32 test1.c test2.c GCC: c:\test>gcc test1.c test2.c 结果 Borland C / C ++: 没有错误并且编译和链接成功(对我来说这是意料之外的。)执行test1.exe ,控制台上打印出2。 这是test2.c定义的num的值。 GCC: GCC给了我一个num的多重定义错误。 当然,没有制作一个。(这是我所期待的) […]