编译

解决'PHDR segment not covered by LOAD segment'的编译错误

出错的Linux环境中,编译用的是xPacks的嵌入式程序开发工具链,编译调用的是arm-none-eabi-gcc,通过 --version 命令发现其版本为2020年的新版本。 相反,在windows环境下,编译不会出错。编译调用的是2018年的版本,是7.x的老版本。 因此,将Linux环境下的工具链替换为与windows环境相同的老版本即可。 具体PHDR segment相关的知识尚未理解。

使用DataflowSanitizr实现污点追踪

示例程序 test.c #include <sanitizer/dfsan_interface.h> #include <assert.h> int main(void) { int i = 1; dfsan_label i_label = dfsan_create_label("i", 0); dfsan_set_label(i_label, &i, sizeof(i)); int j = 2; dfsan_label j_label = dfsan_create_label("j", 0); dfsan_set_label(j_label, &j, sizeof(j)); int k = 3; dfsan_label k_label = dfsan_create_label("k", 0); dfsan_set_label(k_label, &k, sizeof(k)); dfsan_label ij_label = dfsan_get_label(i + j); assert(dfsan_has_label(ij_label, i_label)); assert(dfsan_has_label(ij_label, j_label)); assert(!dfsan_has_label(ij_label, k_label)); dfsan_label ijk_label = dfsan_get_label(i + j + k); assert(dfsan_has_label(ijk_label, i_label)); assert(dfsan_has_label(ijk_label, j_label)); assert(dfsan_has_label(ijk_label, k_label)); return 0; } sanitizer/dfsan_interface.

解决'undefined reference to xxx'的编译错误的一个思路

一个小实验 编辑hello.h如下: #ifndef HELLO_H #define HELLO_H void myprint(const char* name); #endif 编辑hello.c如下: #include <stdio.h> void myprint(const char* name) { printf(name); printf("\n"); _zeqi_printf("end\n"); } 编辑main.c如下: #include "hello.h" int main() { myprint("test"); return 0; } 执行如下命令进行编译,生成hello.o和main.o。: gcc -c hello.c gcc -c main.c 执行如下命令生成可执行文件: gcc hello.o main.o -o hello 会出现以下错误: /usr/bin/ld: hello.o: in function `myprint': hello.c:(.text+0x38): undefined reference to `_zeqi_printf' collect2: error: ld returned 1 exit status 可知出现错误的原因是hello.c的myprint函数中调用的_zeqi_printf函数未定义。 解决问题的方法就是让编译器找到_zeqi_printf的定义。为此,编辑repair.c如下: #include <stdio.h> void _zeqi_printf(const char* name) { printf("zeqi_"); printf(name); printf("\n"); } 执行如下命令编译repaire.