随笔分类 - Unix/Linux
摘要:话说上回说到,C程序运行之前,必须要加载到其进程地址空间中。今儿咱就扯扯这个加载到底是怎么加载的。 一图胜前言,这个图简单说明了可执行文件加载过程的逻辑流,在此只做粗粒度概要说明。需要准确描述的,请出门左转,看源码去吧。1. 程序总是运行在进程上下文(context)中的,当输入./meml...
阅读全文
摘要:一个成功的男人背后,至少有一个伟大的女人;一个不成功的男人,至少有一双手。而一个C程序,无论成功不成功,它的背后一定有一个操作系统,一个shell,一套工具链。世界本就不公平。隐藏在显而易见的事实背后的,你若能看透,便可以站在对自己公平的那一端。1、进程地址空间一个进程一旦建立,就会自认为占有4G内...
阅读全文
摘要:这种错误只能说是坑,如果没有见到过,很可能就要摔里头。解决问题是重要的,但弄明白问题的来源,往往更为重要。所以要先扯一下,换行和回车的历史遗留问题。在计算机出现之前,有个玩意叫电传打字机。每秒钟可以打10个字符,但是在打完一行需要换行时,要用去0.2s。这正好可以打2个字符,这段时间里如果有字符传过来,那么这些字符将被丢失。很显然,要解决这个问题,最简单的办法就是浪费这个0.2s。同时,我们在写东西时,要把手换到下一行及每行的首位置,也就是说这是两个动作。自然而然地,研发人员在每一行后面添加了两个表示结束的字符(回车+换行)。所谓“回车”:让打字机的打印头重新回到一行的首位置(左边界);所谓“
阅读全文
摘要:几个文件在堆代码的过程中,最常用到的文件有:头文件(.h)、源文件(.c/.cpp)、目标文件(.o/.obj)、库文件(.a/.lib和.so/.dll)和可执行文件(.out/.exe)。其中,头文件和源文件是用ACSII字符码出来的,处理器是读不懂这些字符的,所以需要编译器把它们翻译成二进制;目标文件、库文件和可执行文件都是经编译器处理之后的二进制文件,这是用户不可读的,所以打开这些文件也只是乱码。由于库文件和可执行文件是由目标文件进一步生成的,因而它们存储的内容并无太大差别,即代码和数据。在linux中,三者都是以ELF格式(Executable Linkable Format)存储的
阅读全文
摘要:由于项目需要,需要用嵌入式数据库SQLite3搭建数据库。首先当然是要安装SQLite啦。 从官网下了安装包,读完README和INSTALL,发现安装过程很简单,还是老三式: ./configure、make 和 make install。但是在安装好之后,程序还是无法运行,出现错误: ERROR
阅读全文