1.linux系统维护常见错误记录
2.CS143:编译原理|PA2:正则表达式和词法分析
3.linuxï¼2.4 å¦ä½å®è£
tcpdump
4.linux内核编译出错解决办法
5.编译原理试题·
linux系统维护常见错误记录
一:卸载的源译错时候出现的错误:
umount /dev/nb1
device is busy
解决:找到是什么进程使得他busy,用 lsof /dev/nb1 . kill掉那个进程,码编然后重新umount即可。
二:GD2编译的源译错时候出现的错误:
The usual way to define `LIBTOOL’ is to add `AC_PROG_LIBTOOL’
Libtool library used but `LIBTOOL’ is undefined
[Makefile.in] Error 1
解决:缺少编译安装的软件包。如:yum install automake,码编libjpeg-devel,libpng-devel,freetype-devel,libtiff-devel,autoconf,gettext-devel,libtool
三:安装 snmp的时候出现的错误:
1/bin/sed: can’t read /usr/lib/libbeecrypt.la: No such file or directory
libtool: link: `/usr/lib/libbeecrypt.la’ is not a valid libtool archive
make[1]: *** [libnetsnmpmibs.la] Error 1
解决:以为缺少libbeecrypt.la ,libbeecrypt.so等共享库,源译错如:yum install libbeecrypt.la
2/usr/bin/ld: cannot find -lelf
解决:ln -s /usr/lib/libelf.so.1 /usr/lib/libelf.so
3/usr/bin/ld:can’t not find -lselinux
解决:缺少libselinux 和 libselinux-devel包,码编求生之路源码在哪如:yum install libselinux
四:Rsync同步常见问题:
错误一:
@ERROR: auth failed on module xxxxx
rsync: connection unexpectedly closed ( bytes read so far)
rsync error: error in rsync protocol data stream (code ) at io.c()
解决:这是源译错因为密码设置错了,无法登入成功,码编检查一下rsync.pwd,源译错看客服是码编否匹配。还有服务器端没启动rsync 服务也会出现这种情况。源译错
错误二:
password file must not be other-accessible
continuing without password file
Password:
解决:这是码编因为rsyncd.pwd rsyncd.sec的权限不对,应该设置为。源译错如:chmod rsyncd.pwd
错误三:
@ERROR: chroot failed
rsync: connection unexpectedly closed ( bytes read so far)
rsync error: error in rsync protocol data stream (code ) at io.c()
解决:这是码编因为你在 rsync.conf 中设置的 path 路径不存在,要新建目录才能开启同步。源译错
错误四:
rsync: failed to connect to ...2: No route to host ()
rsync error: error in socket IO (code ) at clientserver.c() [receiver=2.6.9]
解决:对方没开机、防火墙阻挡、通过的网络上有防火墙阻挡,都有可能。关闭防火墙,其实就是把tcp udp 的端口打开。
五:软件安装的时候常出现的问题:
configure: error: …No recognized SSL/TLS toolkit detected
# yum -y install openssl-devel
configure: error: no acceptable cc found in $PATH
yum -y install gcc-c++
configure: error: cannot find output from lex; giving up flex is not installed, install flex.
yum -y install flex
configure: error: xml2-config not found. Please check your libxml2 installation.
yum -y install libxml2-devel
configure: error: Cannot find OpenSSL’s
yum -y install openssl-devel
configure: error: Please reinstall the BZip2 distribution
yum -y install bzip2-devel
configure: error: Please reinstall the libcurl distribution - easy.h should be in /include/curl/
yum -y install curl-devel
configure: error: libjpeg.(a|so) not found.
yum -y install libjpeg-devel
configure: error: libpng.(a|so) not found.
yum -y install libpng-devel
configure: error: freetype2 not found!
yum -y install freetype-devel
configure: error: Unable to locate gmp.h
yum -y install gmp-devel
configure: error: Cannot find pspell
yum -y install aspell-devel
libtool: link: cannot find the library `/usr/lib/libbeecrypt.la’ (librpmio.la: /usr/lib/libbeecrypt.la)
解决:缺少beecrypt包,如:
pare.py`,通过`make dotest`和`lexer test.cl`指令,对比你的绿豆app源码lexer输出与标准输出,不断调整和优化你的`.flex`文件,直到两者完全匹配。
在flex的`.flex`文件中,关键部分在于rules区域,这里定义了正则表达式和处理代码的映射。例如,使用正则表达式".*"匹配任意字符序列。Definitions区域包含了预定义的C代码和flex的定义,记得保持C代码的缩进一致性。在rules中,记得正则表达式单独一行,与后续代码保持适当间距。对于处理函数,根据是否返回值,C代码会有不同的编写方式,注释也需要对齐,灵活代码的调用会显示匹配信息。
词法分析器要处理的关键字、整数、字符串、注释、符号和特殊字符,都有一套严谨的规则。例如,动态溯源码关键字的处理简单,但要确保它们与cool-parse.h中的定义一致。字符串字面量的解析则涉及状态机和转义字符,确保处理完整性和正确性。
最后,通过构建`test.cl`并执行`make dotest`和`lexer test.cl`,持续测试并优化你的lexer。GitHub仓库会随你的学习进度更新测试用例和代码。记住,词法分析的难点在于覆盖所有可能的情况,每个细节都需要精心雕琢。现在,就让我们一起沉浸在编译原理的海洋中,感受词法分析的魔力吧!
linuxï¼2.4 å¦ä½å®è£ tcpdump
å®è£ è¿ç¨åç §ä»¥ä¸æ¥éª¤ï¼
1ãæå¼ç½åï¼www.tcpdump.org/ ä¸è½½ libpcap-1.0.0.tar.gz (.0KB) 软件å ï¼éè¿å½ä»¤ tar zxvf libpcap-1.0.0.tar.gz 解åæ件ï¼å¹¶å°å ¶æ¾å ¥èªå®ä¹çå®è£ ç®å½ã
2ãæå¼ç½åï¼flex.sourceforge.net/ ä¸è½½ flex-2.5..tar.gz (1.MB) 软件å ï¼éè¿ tar zxvf flex-2.5..tar.gz 解åæ件ï¼å¹¶å°å ¶æ¾å ¥ä¸è¿°èªå®ä¹çå®è£ ç®å½ä¸ã
ã 注ï¼å¦æ没æç¼è¯å®è£ æ¤æ件ï¼å¨ç¼è¯å®è£ libpcapæ¶ï¼å°±ä¼åºç° âconfigure: error: Your operating system's lex is insufficient to compile libpcap.âçé误æ示ã
3ãæå¼ç½åï¼ftp.gnu.org/gnu/bison/ ä¸è½½ bison-2.4.1.tar.gz (1.9MB) 软件å ï¼éè¿ tar zxvf bison-2.4.1.tar.gz 解åæ件ï¼å¹¶å°å ¶æ¾å ¥ä¸è¿°èªå®ä¹çå®è£ ç®å½ä¸ã
ã 注ï¼å¦æ没æç¼è¯å®è£ æ¤æ件ï¼å¨ç¼è¯å®è£ libpcapæ¶ï¼å°±ä¼åºç° "configure: WARNING: don't have both flex and bison; reverting to lex/yacc checking for capable lex... insufficient" çé误æ示ã
4ãæå¼ç½åï¼ftp.gnu.org/gnu/m4/ ä¸è½½ m4-1.4..tar.gz (1.2MB)软件å ï¼éè¿ tar zxvf m4-1.4..tar.gz 解åæ件ï¼å¹¶å°å ¶æ¾å ¥ä¸è¿°èªå®ä¹çå®è£ ç®å½ä¸ã
ã 注ï¼å¦æ没æç¼è¯å®è£ æ¤æ件ï¼å¨ç¼è¯å®è£ bison-2.4.1æ¶ï¼å°±ä¼åºç° âconfigure: error: GNU M4 1.4 is requiredâçé误æ示ã
5ãèåä¾æ¬¡è¿å ¥ç®å½m4-1.4.ï¼bison-2.4.1ï¼flex-2.5.ï¼libpcap-1.0.0 并æ§è¡ä»¥ä¸å½ä»¤ï¼
ãã(sudo) ./configure
ãã(sudo) make
ãã(sudo) make install
linux内核编译出错解决办法
遇到Linux内核编译中出现menuconfig没有配置界面出来的错误,通常是因为缺少必要的库文件导致无法加载curses功能。为解决此问题,首先需要确保系统已安装了curses库。通过运行以下命令进行安装:
sudo apt-get install libncurses5-dev
完成安装后,尝试再次执行make menuconfig命令,内核配置界面应能正常显示。
若在编译Linux内核时遇到yylloc错误,这通常与编译器或相关工具链的版本不兼容有关。yylloc错误多见于使用flex和bison进行解析的源码开发原理项目。为解决此问题,可采取以下步骤:
1. 确保flex和bison的版本与内核编译所需版本匹配。可通过运行以下命令检查flex和bison的版本:
flex --version
bison --version
2. 若版本不匹配,考虑更新或回滚至兼容版本。可以通过apt或包管理器实现版本更新或回滚。
3. 在编译内核前,先确保系统环境变量PATH包含flex和bison的安装路径,以确保编译器能找到所需的工具。
4. 使用正确的编译选项和参数进行内核编译,确保所有依赖项都已正确配置。
通过上述步骤,应能有效解决Linux内核编译过程中遇到的menuconfig配置界面缺失和yylloc错误问题,确保编译过程顺利进行。
编译原理试题·
Lex和Yacc应用方法(一).初识Lex
草木瓜
Lex(Lexical Analyzar 词法分析生成器),Yacc(Yet Another Compiler Compiler
编译器代码生成器)是Unix下十分重要的词法分析,语法分析的工具。经常用于语言分
析,公式编译等广泛领域。遗憾的是网上中文资料介绍不是过于简单,就是跳跃太大,
入门参考意义并不大。本文通过循序渐进的例子,从0开始了解掌握Lex和Yacc的用法。
一.Lex(Lexical Analyzar) 初步示例
先看简单的原神 源码例子(注:本文所有实例皆在RetHat Linux下完成):
一个简单的Lex文件 exfirst.l 内容:
%{
#include "stdio.h"
%}
%%
[\n] ;
[0-9]+ printf("Int : %s\n",yytext);
[0-9]*\.[0-9]+ printf("Float : %s\n",yytext);
[a-zA-Z][a-zA-Z0-9]* printf("Var : %s\n",yytext);
[\+\-\*\/\%] printf("Op : %s\n",yytext);
. printf("Unknown : %c\n",yytext[0]);
%%
在命令行下执行命令flex解析,会自动生成lex.yy.c文件:
[root@localhost liweitest]flex exfirst.l
进行编译生成parser可执行程序:
[root@localhost liweitest]cc -o parser lex.yy.c -ll
[注意:如果不加-ll链结选项,cc编译时会出现以下错误,后面会进一步说明。]
/usr/lib/gcc-lib/i-redhat-linux/3.2.2/../../../crt1.o(.text+0x): In function `_start':
../sysdeps/i/elf/start.S:: undefined reference to `main'
/tmp/cciACkbX.o(.text+0xb): In function `yylex':
: undefined reference to `yywrap'
/tmp/cciACkbX.o(.text+0xabd): In function `input':
: undefined reference to `yywrap'
collect2: ld returned 1 exit status
创建待解析的文件 file.txt:
title
i=1+3.9;
a3=/6
bcd=4%9-
通过已生成的可执行程序,进行文件解析。
[root@localhost liweitest]# ./parser < file.txt
Var : title
Var : i
Unknown : =
Int : 1
Op : +
Float : 3.9
Unknown : ;
Var : a3
Unknown : =
Int :
Op : /
Int : 6
Var : bcd
Unknown : =
Int : 4
Op : %
Int : 9
Op : -
Int :
到此Lex用法会有个直观的了解:
1.定义Lex描述文件
2.通过lex,flex工具解析成lex.yy.c文件
3.使用cc编译lex.yy.c生成可执行程序
再来看一个比较完整的Lex描述文件 exsec.l :
%{
#include "stdio.h"
int linenum;
%}
%%
title showtitle();
[\n] linenum++;
[0-9]+ printf("Int : %s\n",yytext);
[0-9]*\.[0-9]+ printf("Float : %s\n",yytext);
[a-zA-Z][a-zA-Z0-9]* printf("Var : %s\n",yytext);
[\+\-\*\/\%] printf("Op : %s\n",yytext);
. printf("Unknown : %c\n",yytext[0]);
%%
showtitle()
{
printf("----- Lex Example -----\n");
}
int main()
{
linenum=0;
yylex(); /* 进行分析 */
printf("\nLine Count: %d\n",linenum);
return 0;
}
int yywrap()
{
return 1;
}
进行解析编译:
[root@localhost liweitest]flex exsec.l
[root@localhost liweitest]cc -o parser lex.yy.c
[root@localhost liweitest]./parser < file.txt
----- Lex Example -----
Var : i
Unknown : =
Int : 1
Op : +
Float : 3.9
Unknown : ;
Var : a3
Unknown : =
Int :
Op : /
Int : 6
Var : bcd
Unknown : =
Int : 4
Op : %
Int : 9
Op : -
Int :
Line Count: 4
这里就没有加-ll选项,但是可以编译通过。下面开始着重整理下Lex描述文件.l。
二.Lex(Lexical Analyzar) 描述文件的结构介绍
Lex工具是一种词法分析程序生成器,它可以根据词法规则说明书的要求来生成单词识
别程序,由该程序识别出输入文本中的各个单词。一般可以分为<定义部分><规则部
分><用户子程序部分>。其中规则部分是必须的,定义和用户子程序部分是任选的。
(1)定义部分
定义部分起始于 %{ 符号,终止于 %} 符号,其间可以是包括include语句、声明语句
在内的C语句。这部分跟普通C程序开头没什么区别。
%{
#include "stdio.h"
int linenum;
%}
(2) 规则部分
规则部分起始于"%%"符号,终止于"%%"符号,其间则是词法规则。词法规则由模式和
动作两部分组成。模式部分可以由任意的正则表达式组成,动作部分是由C语言语句组
成,这些语句用来对所匹配的模式进行相应处理。需要注意的是,lex将识别出来的单
词存放在yytext[]字符数据中,因此该数组的内容就代表了所识别出来的单词的内容。
类似yytext这些预定义的变量函数会随着后面内容展开一一介绍。动作部分如果有多
行执行语句,也可以用{ }括起来。
%%
title showtitle();
[\n] linenum++;
[0-9]+ printf("Int : %s\n",yytext);
[0-9]*\.[0-9]+ printf("Float : %s\n",yytext);
[a-zA-Z][a-zA-Z0-9]* printf("Var : %s\n",yytext);
[\+\-\*\/\%] printf("Op : %s\n",yytext);
. printf("Unknown : %c\n",yytext[0]);
%%
A.规则部分的正则表达式
规则部分是Lex描述文件中最为复杂的一部分,下面列出一些模式部分的正则表达式字
符含义:
A-Z, 0-9, a-z 构成模式部分的字符和数字。
- 指定范围。例如:a-z 指从 a 到 z 之间的所有字符。
\ 转义元字符。用来覆盖字符在此表达式中定义的特殊意义,
只取字符的本身。
[] 表示一个字符集合。匹配括号内的任意字符。如果第一个字
符是^那么它表示否定模式。例如: [abC] 匹配 a, b, 和C
的任何一个。
^ 表示否定。
* 匹配0个或者多个上述模式。
+ 匹配1个或者多个上述模式。
匹配0个或1个上述模式。$ 作为模式的最后一个字符时匹配一行的结尾。
{ } 表示一个模式可能出现的次数。 例如: A{ 1,3} 表示 A 可
能出现1次或3次。[a-z]{ 5} 表示长度为5的,由a-z组成的
字符。此外,还可以表示预定义的变量。
. 匹配任意字符,除了 \n。
( ) 将一系列常规表达式分组。如:{ Letter}({ Letter}|{ Digit})*
| 表达式间的逻辑或。
"一些符号" 字符的字面含义。元字符具有。如:"*" 相当于 [\*]。
/ 向前匹配。如果在匹配的模式中的"/"后跟有后续表达式,
只匹配模版中"/"前面的部分。如:模式为 ABC/D 输入 ABCD,
时ABC会匹配ABC/D,而D会匹配相应的模式。输入ABCE的话,
ABCE就不会去匹配ABC/D。
B.规则部分的优先级
规则部分具有优先级的概念,先举个简单的例子:
%{
#include "stdio.h"
%}
%%
[\n] ;
A { printf("ONE\n");};
AA { printf("TWO\n");};
AAAA { printf("THREE\n");};
%%
此时,如果输入内容:
[root@localhost liweitest]# cat file1.txt
AAAAAAA
[root@localhost liweitest]# ./parser < file1.txt
THREE
TWO
ONE
Lex分析词法时,是逐个字符进行读取,自上而下进行规则匹配的,读取到第一个A字符
时,遍历后发现三个规则皆匹配成功,Lex会继续分析下去,读至第五个字符时,发现
"AAAA"只有一个规则可用,即按行为进行处理,以此类推。可见Lex会选择最长的字符
匹配规则。
如果将规则
AAAA { printf("THREE\n");};
改为
AAAAA { printf("THREE\n");};
./parser < file1.txt 输出结果为:
THREE
TWO
再来一个特殊的例子:
%%
title showtitle();
[a-zA-Z][a-zA-Z0-9]* printf("Var : %s\n",yytext);
%%
并输入title,Lex解析完后发现,仍然存在两个规则,这时Lex只会选择第一个规则,下面
的则被忽略的。这里就体现了Lex的顺序优先级。把这个例子稍微改一下:
%%
[a-zA-Z][a-zA-Z0-9]* printf("Var : %s\n",yytext);
title showtitle();
%%
Lex编译时会提示:warning, rule cannot be matched.这时处理title字符时,匹配
到第一个规则后,第二个规则就无效了。
再把刚才第一个例子修改下,加深下印象!
%{
#include "stdio.h"
%}
%%
[\n] ;
A { printf("ONE\n");};
AA { printf("TWO\n");};
AAAA { printf("THREE\n");};
AAAA { printf("Cannot be executed!");};
./parser < file1.txt 显示效果是一样的,最后一项规则肯定是会忽略掉的。
C.规则部分的使用变量
且看下面示例:
%{
#include "stdio.h"
int linenum;
%}
int [0-9]+
float [0-9]*\.[0-9]+
%%
{ int} printf("Int : %s\n",yytext);
{ float} printf("Float : %s\n",yytext);
. printf("Unknown : %c\n",yytext[0]);
%%
在%}和%%之间,加入了一些类似变量的东西,注意是没有;的,这表示int,float分
别代指特定的含义,在两个%%之间,可以通过{ int}{ float}进行直接引用,简化模
式定义。
(3) 用户子程序部分
最后一个%%后面的内容是用户子程序部分,可以包含用C语言编写的子程序,而这些子
程序可以用在前面的动作中,这样就可以达到简化编程的目的。这里需要注意的是,
当编译时不带-ll选项时,是必须加入main函数和yywrap(yywrap将下后面说明)。如:
...
%%
showtitle()
{
printf("----- Lex Example -----\n");
}
int main()
{
linenum=0;
yylex(); /* 进行Lex分析 */
printf("\nLine Count: %d\n",linenum);
return 0;
}
int yywrap()
{
return 1;
}
三.Lex(Lexical Analyzar) 一些的内部变量和函数
内部预定义变量:
yytext char * 当前匹配的字符串
yyleng int 当前匹配的字符串长度
yyin FILE * lex当前的解析文件,默认为标准输出
yyout FILE * lex解析后的输出文件,默认为标准输入
yylineno int 当前的行数信息
内部预定义宏:
ECHO #define ECHO fwrite(yytext, yyleng, 1, yyout) 也是未匹配字符的
默认动作
内部预定义的函数:
int yylex(void) 调用Lex进行词法分析
int yywrap(void) 在文件(或输入)的末尾调用。如果函数的返回值是1,就停止解
析。 因此它可以用来解析多个文件。代码可以写在第三段,这
样可以解析多个文件。 方法是使用 yyin 文件指针指向不同的
文件,直到所有的文件都被解析。最后,yywrap() 可以返回1
来表示解析的结束。
lex和flex都是解析Lex文件的工具,用法相近,flex意为fast lexical analyzer generator。
可以看成lex的升级版本。
相关更多内容就需要参考flex的man手册了,十分详尽。
四.关于Lex的一些综述
Lex其实就是词法分析器,通过配置文件*.l,依据正则表达式逐字符去顺序解析文件,
并动态更新内存的数据解析状态。不过Lex只有状态和状态转换能力。因为它没有堆栈,
它不适合用于剖析外壳结构。而yacc增加了一个堆栈,并且能够轻易处理像括号这样的
结构。Lex善长于模式匹配,如果有更多的运算要求就需要yacc了。
2024-12-27 14:03
2024-12-27 13:38
2024-12-27 13:30
2024-12-27 12:28
2024-12-27 12:19
2024-12-27 12:15
2024-12-27 11:53
2024-12-27 11:49