Tag: gcc

直接将C程序与ld链接失败,未定义引用`__libc_csu_fini`

我正在尝试在Linux下编译一个C程序。 然而,出于好奇,我正在尝试手动执行一些步骤:我使用: gcc前端生成汇编代码 然后运行GNU汇编程序以获取目标文件 然后将其与C运行时链接以获取可用的可执行文件。 现在我被连接部分困住了。 该程序是一个非常基本的“Hello world”: #include int main() { printf(“Hello\n”); return 0; } 我使用以下命令来生成汇编代码: gcc hello.c -S -masm=intel 我告诉gcc在编译后退出并使用Intel语法转储汇编代码。 然后我使用GNU汇编程序来生成目标文件: as -o hello.o hello.s 然后我尝试使用ld生成最终的可执行文件: ld hello.o /usr/lib/libc.so /usr/lib/crt1.o -o hello 但我不断收到以下错误消息: /usr/lib/crt1.o: In function `_start’: (.text+0xc): undefined reference to `__libc_csu_fini’ /usr/lib/crt1.o: In function `_start’: (.text+0x11): undefined reference to `__libc_csu_init’ 符号__libc_csu_fini/init似乎是glibc的一部分,但我无法在任何地方找到它们! 我尝试使用相同的结果静态链接libc(针对/usr/lib/libc.a […]

如何在Make中使用pkg-config

我想编译最简单的GTK程序。 我可以使用命令行编译它: gcc $(pkg-config –cflags –libs gtk+-3.0) main.c -o main.o 但是,如果我使用Make它不起作用: CFLAGS=-g -Wall -Wextra $(pkg-config –cflags) LDFLAGS=$(pkg-config –libs gtk+-3.0) CC=gcc SOURCES=$(wildcard *.c) EXECUTABLES=$(patsubst %.c,%,$(SOURCES)) all: $(EXECUTABLES) 它告诉我这个: gcc -g -Wall -Wextra -c -o main.o main.c main.c:1:21: fatal error: gtk/gtk.h: No such file or directory #include ^ compilation terminated. : recipe for target ‘main.o’ failed make: […]

“地址”(&)被忽略的数组/地址是gcc吗?

我是入门编程课程的助教,有些学生犯了这种错误: char name[20]; scanf(“%s”,&name); 这并不奇怪,因为他们正在学习……令人惊讶的是,除了gcc警告之外,代码也起作用(至少这部分)。 我一直在努力理解,并编写了以下代码: void foo(int *v1, int *v2) { if (v1 == v2) printf(“Both pointers are the same\n”); else printf(“They are not the same\n”); } int main() { int test[50]; foo(&test, test); if (&test == test) printf(“Both pointers are the same\n”); else printf(“They are not the same\n”); } 编译和执行: $ gcc test.c […]

声明一个负长度数组

当你创建一个负长度数组时,C会发生什么? 例如: int n = -35; int testArray[n]; for(int i = 0; i < 10; i++) testArray[i]=i+1; 此代码将编译(并且在启用-Wall时不会显示任何警告),并且您似乎可以毫无问题地分配给testArray[0] 。 分配过去会给出段错误或非法指令错误,并从数组中读取任何内容,说“中止陷阱”(我不熟悉那个)。 我意识到这在某种程度上是学术性的,并且(希望)永远不会出现在现实生活中,但C标准是否有任何特定的方式来处理这样的数组,或者它是否因编译器而异?

SSE寄存器返回SSE禁用

我遇到以下情况: 我正在为不允许SSE指令的内核编写代码 我需要做浮点运算 我正在为x86_64平台编译 这是一个代码示例,说明了问题: int main(int argc, char** argv) { double d = 0.0, dbase; uint64_t base_value = 300; d = (2200.0 – 1000.0)/(1000.0); dbase = d * base_value; printf(“d = %f, dbase = %f\n”, d, dbase); base_value = dbase; printf(“base_value = %llu\n”, (long long unsigned)base_value); return 0; } 这是makefile中的相关行: CFLAGS += -mcmodel=kernel -mno-red-zone […]

如何在静态库中使用gcc链接强符号来覆盖弱符号?

我的问题可归纳如下: bar.c : #include void bar() { printf(“bar\n”); } main.c : #include void __attribute__((weak)) bar() { printf(“foo\n”); } int main() { bar(); return 0; } Makefile : all: gcc -c bar.c ar -rc libbar.a bar.o gcc main.c -L. -lbar 输出 : $ ./a.out foo 所以main.c中的弱符号栏不会被bar.c中的强符号覆盖,因为bar.c被链接到静态库libbar.a中的main.c. 我怎么能告诉gcc在libbar.a中使用强符号来覆盖main.c中的弱符号?

是否有一个GCC编译器/链接器选项来更改main的名称?

我的软件有一个主要用于正常使用,另一个用于unit testing。 如果gcc有一个选项来指定使用哪个“主要”function,我会喜欢它。

如何在C(gcc)中获取自定义ELF部分的起始和结束地址?

我已经看到使用gcc __section__属性 (特别是在Linux内核中)将数据(通常是函数指针)收集到自定义ELF部分中。 如何检索和使用这些自定义部分中的“东西”?

MinGW GCC:“未知的转换类型字符’h’”(snprintf)

好吧,我遇到了一个奇怪的问题,在Windows 7上使用MinGW(GCC 4.6.2)编译C文件。该文件包含以下C代码: #include int main(int argc, char *argv[]) { printf(“%2hhX\n”, 250); char c[80]; snprintf(c, sizeof(c), “%2hhX”, 250); printf(“%s\n”, c); return 0; } 编译结果如下: $ gcc.exe -std=c99 -pedantic -Wall test.c test.c: In function ‘main’: test.c:6:2: warning: unknown conversion type character ‘h’ in format [-Wformat] test.c:6:2: warning: too many arguments for format [-Wformat-extra-args] 现在,对我来说很奇怪的是它抱怨第6行的snprintf调用,而不是第4行的printf调用。我错过了什么或警告是不正确的? 另外,格式字符串”%2hhX”可能有更好的等价物吗? (我正在尝试将char变量打印为hex值。)

轻松“反转”C预处理器宏的集合

我有很多预处理器宏定义,如下所示: #define FOO 1 #define BAR 2 #define BAZ 3 在实际应用中,每个定义对应于解释器虚拟机中的指令。 这些宏在编号方面也不是连续的,以便为将来的指令留出空间; 可能有#define FOO 41 ,然后下一个是#define BAR 64 。 我现在正在为这个虚拟机开发一个调试器,需要有效地“反转”这些预制宏。 换句话说,我需要一个获取数字并返回宏名称的函数,例如2的输入返回”BAR” 。 当然,我可以自己创建一个使用switch的function: const char* instruction_by_id(int id) { switch (id) { case FOO: return “FOO”; case BAR: return “BAR”; case BAZ: return “BAZ”; default: return “???”; } } 但是,这将是一个难以维护的噩梦,因为重命名,删除或添加指令也需要修改此function。 是否有另一个宏可以用来为我创建这样的函数,还是有其他方法? 如果没有,是否可以创建宏来执行此任务? 我在Windows 10上使用gcc 6.3。