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