- 博客(122)
- 收藏
- 关注
原创 解决 WSL 中报错 Error: no “view“ mailcap rules found for type “application/msword“
在调试llvm过程的指令选择过程中,如果想查看dag图,在wsl中会出现如下报错:
2024-05-20 23:13:05 356
原创 示例解析 --as-needed 和 --no-as-needed 的作用和区别
在编译pytorch时,会注意到链接参数 -Wl,--no-as-needed, 那么这个参数的作用是什么呢?
2024-04-16 20:26:11 560
原创 collect2: fatal error: ld terminated with signal 9 [Killed]
在 WSL2 中编译 LLVM遇到了如下报错:经过查询,发现是因为内存不足,造成进程被killed。默认WSL2 的内存是主机内存的50%或者8GB。因此提高内存上限即可。如果主机内存有限,可以增大swap的大小。默认 swap大小为内存的25%。,其中 UserName 为相对应的用户名。默认不存在这个文件,手动创建一个即可。
2023-07-30 21:26:06 1331
原创 拥有多个github账号时,如何管理多个SSH key?
目前github已经拒绝通过密码访问私有仓库,只能通过SSH Key。但SSH key不能重复使用,如果有多个github账号的话,就需要多个不同的key。
2023-07-02 17:20:08 1385
原创 undefined reference 或 undefined symbol 的常见情形汇总
在程序编译过程中,经常会遇到未定义的问题。本文尝试总结几种常见的导致未定义问题的情况,可以帮助用户在遇到相关问题时,方便排查。
2023-06-19 22:39:31 3419
原创 从源码层面解析linux调度的原理,实现及演进
调度策略是操作系统设计比较重要的一环。它直接影响了系统的性能和响应能力。不同的调度策略会对不同类型的工作负载产生不同的影响。例如,实时调度策略可以确保实时任务及时响应,但可能会对系统的吞吐量产生负面影响。相反,非实时调度策略可以提高系统的吞吐量,但可能会导致实时任务响应延迟。因此,选择适当的调度策略对于满足系统的性能和响应需求至关重要。这里选取Linux 内核中所采用的三种调度方式,通过分析源码来揭开其神秘面纱。
2023-06-04 16:16:02 755
原创 linux中 list_entry 设计背景及原理解析
linux 源码中 list 数据结构应用广泛,设计巧妙。list_entry 的实现是一般初学者经常会感到疑惑的地方,这篇文章对这一问题做一阐释。
2023-05-22 22:30:15 875
原创 Github Copilot Chat申请,安装,及常见问题解决
Copilot Chat 是Copilot X 引入的预览功能,不但可以像Chatgpt一样聊天,也可以解释代码,bug 修复,也可以生成单元测试。是一个非常有吸引力的功能。
2023-05-21 21:21:24 10332 1
原创 c/c++ 输出执行过程中的函数名
为了分析程序,有时候需要打印出执行过程中的函数。一种方案是修改程序源码,在每个函数头部添加打印函数,这样在函数较少的情况下,可以使用。这种方法,对于较大的程序就不实用。-finstrument-functions第二种方案是使用使用gcc 指令 -finstrument-functions, 添加这种指令,可以在进入程序和退出程序前,添加钩子函数。这两个函数的原型如下:void __cyg_profile_func_enter (void *this_fn,
2022-06-05 22:27:08 1257
原创 使用pandoc 生成带中文的pdf
安装pandocsudo apt install pandoc texlive-latex-base \ texlive-extra-utils texlive-latex-extra安装 xelatexsudo apt install texlive-xetex安装字体拷贝字体将windows的字体拷贝至Ubuntu系统目录/usr/share/fonts 下比如在WSL上mkdir -p /usr/share/fonts/truetype/windowsfontsudo cp -
2022-04-23 22:06:18 2170
原创 shell命令记录汇总
调整 shell 提示符长度有时候进入路径太长,在Ubuntu下面,shell 的提示符会特别长,可以通过一下命令设置,只显示最后三层的目录PROMPT_DIRTRIM=3shell 注释注释单行#this is comment注释多行: <<'END'the lines between END are commentsEND通过shell脚本动态生成文件将下面的 file_name 替换为自己的文件名。cat << 'EOF' > file_na
2022-04-10 09:21:53 489
原创 centos 7安装新版本 gcc
centos 7 安装 gcc 和 g++ 的命令分别如下:yum install gccyum install gcc-c++但是安装的版本是:(GCC) 4.8.5 20150623 (Red Hat 4.8.5-44)安装更高版本的 gcc 有两种方式这里以 gcc 7.3 为例1. 手动编译具体步骤参考:build gcc from source on centos 7可以编译成功,也可以正常使用,但是有些编译会2. 使用软件管理Software Collections ,
2022-03-27 18:21:08 10723 6
原创 linux 一些知识点汇总
进程间通信的8种方式匿名管道popen有名管道FIFO信号信号量消息队列共享内存套接字5种 I/O 模型阻塞非阻塞异步信号驱动多路复用
2021-12-15 20:58:07 2478
原创 解析 linux 进程 pid 0, pid 1, pid 2 关系及启动过程
Linux 中有 pid 0, pid 1 和 pid 2 三个特殊的进程。本文以 Linux v2.6.39 为例,说明 Linux中这三个进程的关系及启动过程
2021-12-15 20:52:47 9761
原创 编译安装 libdwarf 记录
从 https://www.prevanders.net/dwarf.html#releases 下载最新的压缩包,本文下载的是libdwarf-0.3.1.tar.xztar xavf libdwarf-0.3.1.tar.xzcd libdwarf-0.3.1./configure --enable-shared --disable-static --disable-libelf --enable-wallmakemake checksudo make installcp ./src/li
2021-11-30 20:01:17 2128
原创 linux 内核编译安装记录 (验证可行)
https://www.kernel.org/cd Downloads$ wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.15.5.tar.xz$ tar xavf linux-5.15.5.tar.xz$ cd linux-5.15.5$ cp /boot/config-$(uname -r) .config$ make
2021-11-27 17:56:06 1381 1
原创 编译内核报错 No rule to make target ‘debian/canonical-certs.pem‘ 或 ‘canonical-revoked-certs.pem‘ 的解决方法
Ubuntu 编译 Linux 内核经常会遇到如下错误:如果报错 canonical-certs.pem:如下:make[1]: *** No rule to make target 'debian/canonical-certs.pem', needed by 'certs/x509_certificate_list'. Stop.make: *** [Makefile:1868: certs] Error 2在命令行中执行:scripts/config --disable SYSTEM_
2021-11-27 11:51:06 15588 5
原创 makefile 示例
下面的 Makefile 包含了一些常用写法,可以根据需要选择增减。CC=gccCFLAGS = -WallLIBS = -lssl -lcryptoifdef DEBUGCFLAGS += -g -DDEBUGendifPROG = prognameSRC = ${wildcard *.h *.c}all: $(PROG)$(PROG): $(SRC) $(CC) $(CFLAGS) $^ -o $@ $(LIBS)clean: rm $(PROG)相应的 make
2021-11-21 21:26:45 436
原创 Linux 不产生 core 文件的解决方法
要注意,ulimit 命令只能影响当前的进程或者说终端。要保证所执行程序的终端的 core size 设置正确。以下步骤在 ubuntu 20.04 和 ubuntu 21.04 测试可行。停止 apport 服务sudo service apport stop为最终执行程序的终端设置 core sizeulimit -c unlimited...
2021-11-20 23:35:04 1424
原创 Linux 下一些调试工具汇总
常用工具trace-cmd - interacts with Ftrace Linux kernel internal tracerkernelshark - graphical reader for trace-cmd(1) outputstrace - trace system calls and signalsgcore - Generate a core file of a running programgdb - The GNU Debuggergprof - display call graph
2021-11-19 22:22:03 1615
原创 探究 sleep(0) 和 sched_yield()
#include <unistd.h>#include <stdio.h>int main(void) { int i; for (i = 0; i < 1000; ++i) { // while(1) { sleep(0); // printf("hello\n"); } return 0;}sudo trace-cmd record -P 12424 -p function_graphs
2021-11-16 22:22:01 1717
原创 一幅图帮助理解C函数的调用栈
调用栈及栈帧对于理解程序的行为非常重要。本文以x86 程序的默认调用方式为例,说明函数调用栈的详细布局。原始程序以如下一段程序为例:int fun(int i, int j);int callee(int i, int j) { int a = i, b = j; return fun(a, b);}int caller(void) { return callee(1, 2);}汇编代码为了得到程序执行过程中的具体细节,需要查看其汇编语言。使用Compi
2021-11-14 23:13:04 872
原创 人人都可以写协程:一个基于汇编的协程实现
本文以有栈非对称协程的实现为例。项目源码在 https://github.com/lylhw13/Coroutine-in-C。准备基本概念编写协程前需要明白几个概念:有栈协程和无栈协程有栈协程:通过保存运行时的堆栈及运行时的上下文来保存运行状态,需要改变调用栈。无栈协程:通过闭包或者状态机的方法记录程序的运行状态,不改变调用栈。对称协程和非对称协程对称协程:各协程之间可以进行执行权的切换。非对称协程:有一个中心化的调度器,所有协程都只和调度器进行执行权的切换。已有的实现案例
2021-11-13 23:16:37 938
原创 在 Windows 和 Linux 平台如何查看 C++ 名称装饰
名字装饰是C++编译器用来为函数和对象添加额外信息的方法。名字装饰有以下几种作用:使链接器能够区分不同版本的重载函数。使链接器能够检查对象和函数在所有模块中的声明方式是否完全相同。使链接器能够在错误信息中提供关于未解析的引用类型的完整信息。名字装饰是为了解决问题1而发明。附带解决了其他问题。以如下一段代码为例:int f(int i) { return i; }int f(void) { return 0; }int g(void) { return f() + f(1); }w
2021-11-04 19:51:08 461
原创 一段程序说明C语言不同调用约定的区别
在 x86-64 平台编译 32位程序gcc version$ gcc -vgcc version 9.3.0 (Ubuntu 9.3.0-17ubuntu1~20.04)gcc -m32 -S test.ccdecl32位默认的调用方式是 cdeclint callee(int,int,int);int caller(void) { return callee(1,2,3) + 5;}caller:.LFB0: endbr32 pushl %ebp
2021-11-04 00:36:12 284
原创 Intel汇编和AT&T汇编的简要区别,生成方法和判断技巧
x86 汇编有两种格式:AT&T 和 Intel,但是这两种格式的操作数 (Operand) 的方向完全相反,容易让人产生疑惑。Unix 系主要是 AT&T 语法格式,Windows系 主要是 Intel 语法格式。insn source, destination # AT&T syntax 方向为 src => dstinsn destination, source ; Intel syntax 类似于编程语言中的 dst = src;快速判断方
2021-11-02 21:26:09 2075
原创 atoi 函数族和 strtol 函数族的区别与联系
atoi 函数族和 strtol 函数族都用来将字符串转换成数字。但是具体的区别和联系是什么呢?通过查看 glibc 的函数源码,可以清楚的看到两者的关系。两个函数族函数返回类型的对应关系。返回类型atoi函数族strol函数族intatoilongatolstrtollong longatollstrtollfloatstrtofdoubleatofstrtod函数原型 long atol(const char *nptr);
2021-09-30 18:26:27 612
原创 常用 tar 命令总结
常用格式tar 命令一般用来将文件归档并压缩,常用的文件格式如下:*.tar 仅将文件归档,不压缩*.tar.gz 将文件归档并压缩成 gz 格式*.tgz 上述格式的简写*.tar.bz2 将文件归档并压缩成 bz2 格式常用参数tar 的参数分为以下四类:主要操作模式: -A, --catenate, --concatenate append tar files to an archive -c, --create creat
2021-09-27 21:06:51 502
原创 powershell 常用命令记录
获取环境变量Get-ChildItem env:字符串匹配findstr "target_str"findstr -I "target_str" // 不区分大小写修改文件时间$(Get-Item file.log).CreationTime=$(Get-Date)$(Get-Item file.log).LastAccessTime=$(Get-Date)$(Get-Item file.log).LastWriteTime=$(Get-Date)//或者直接指定时间$(Get
2021-09-14 20:32:40 221
原创 puts 和 printf 函数的区别
函数原型 int puts(const char *s); int printf(const char * restrict format, ...);区别相同点:都是将字符串输出到标准输出不同点:puts 直接输出字符串,并追加一个换行,不对字符串进行解析。优点是效率高,缺点是需要记住它会在结尾追加换行。printf 对字符串进行解析,然后将字符串格式化输出,puts(str);/* 等价于 */printf("%s\n", str);从防御式编程来说,不要采取下面的格式:
2021-09-05 23:16:25 488
原创 shell 命令筛选不带后缀名的文件
cp -- !(*.*) /new/path/cp -- !(*.txt|*.c|*.py) /path/to/directoryyou could use: find . -type f ! -name "*.*"the ! negates the following expression, here a filename that contains a ‘.’you can also use the -maxdepth option to reduce the search depth.fin
2021-09-05 18:37:01 1336
原创 C 变长参数的实现原理和使用方法
C语言调用规范以 x86 平台为例,C语言在 x86 平台的函数调用方式为 cdecl (C declaration) ,调用者自右向左将参数压入栈中,通过栈来传递参数。示意图如下:C 语言可变参数的使用形式如下,可变参数只能作为最后一个参数出现:int printf(char *fmt, ...)va_list 等函数的一种宏实现熟悉了参数传递的方式,通过最后一个参数确定可变参数的起始位置,并依次返回每个参数,就可以写出 va_list 等函数的一种实现。这种实现只在 x86 平台,并遵循
2021-09-05 17:37:33 340
原创 不同电脑间拷贝 git 仓库
不同电脑间拷贝 git 仓库,有三种方法:直接拷贝整个目录直接拷贝整个目录,如果是从windows 复制到 linux,或者相反方向复制,会发现大部分文件会被标记成 Modified。这是因为 git 在 clone 的时候会重整换行符。而 windows 和 linux 的换行符不同造成的。解决办法是在拷贝过来后执行:git reset --hard HEAD使用 git 打包工具在原电脑执行如下打包指令$ git bundle create repo.bundle HEAD maste
2021-08-30 23:01:05 3275 1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人