我的 Lex 代码在 *yy_cp = yy_hold_char 行接收分段错误(核心转储)
My Lex code receiving segmentation fault (core dump) at line *yy_cp = yy_hold_char
这里是从 .Lex 生成的 .c 代码片段。
Coredump 将在第一次迭代时出现
while (1) /* loops until end-of-file is reached */{
yy_cp = yy_c_buf_p;
/* Support of yytext. */
*yy_cp = yy_hold_char; // receiving coredump here
/* yy_bp points to the position in yy_ch_buf of the start of
* the current run.*/
yy_bp = yy_cp;
yy_current_state = yy_start;}
我有自己问题的答案。下面是对Solution
的一些解释
- 我有两个.Lex (Type1_Lex.l & Type2_Lex.l)和两个.Yacc (Type1_Yacc.y & Type2_Yacc.y)代码
- 我正在编译所有相关的 .c(Type1_Lex.c、Type2_Lex.c、Type1_Yacc.c & Type2_Yacc.v)和 .h 文件正在生成
- 并进一步编译 .c 生成 Type1_Lex.o、Type2_Lex.o、Type1_Yacc.o Type2_Yacc.o
- 此外,我将所有这些目标文件放在一个 .a 中
问题就在这里
- ...
ld:警告:符号“yy_create_buffer”的大小从 libuperbe.a(TYPE1_Lex 中的 318 更改而来。 o) libxxx.a 中的 208 (TYPE2_Lex.o)
ld:警告:符号“yy_load_buffer_state”的大小已从 libuperbe.a(TYPE1_Lex[ 中的 262 更改为=77=].o) 到 libxxx.a(TYPE2_Lex.o)
中的 146
ld:警告:符号“yy_init_buffer”的大小已从 libuperbe.a(TYPE1_Lex[ 中的 278 更改为=77=].o) 到 libxxx.a(TYPE2_Lex.o)
中的 164
生成的 .c 中有些符号相同 (TYPE1_Lex.c & TYPE2_Lex.c)
当两个目标文件绑定在一个.a中时类似
(yy_create_buffer,yy_init_buffer,yy_load_buffer_state) 符号得到
覆盖.
在 运行 时应调用方法 yy_create_buffer()、yy_init_buffer()、yy_load_buffer_state() 在 TYPE2_Lex.c 但实际上这些方法是从文件 TYPE1_Lex.c 中调用的,并且会导致内存损坏。
为了继续前进,我决定使用具有以下模式的 sed:
Sed TYPE2_Lex.c 与 :
- s/yy_create_buffer()/TYPE1_create_buffer/g
- s/yy_init_buffer()/TYPE1_init_buffer/g
- s/yy_load_buffer_state()/TYPE1_load_buffer_state/g
Sed TYPE2_Lex.c 与
- s/yy_create_buffer()/TYPE2_create_buffer/g
- s/yy_init_buffer()/TYPE2_init_buffer/g
- s/yy_load_buffer_state()/TYPE2_load_buffer_state/g
使Loader可以很容易的区分符号。并且在 运行 时,方法名称之间的混淆变为 null。
完成所有这些步骤后,我可以继续前进了:)
感谢大家的帮助:)
这里是从 .Lex 生成的 .c 代码片段。
Coredump 将在第一次迭代时出现
while (1) /* loops until end-of-file is reached */{
yy_cp = yy_c_buf_p;
/* Support of yytext. */
*yy_cp = yy_hold_char; // receiving coredump here
/* yy_bp points to the position in yy_ch_buf of the start of
* the current run.*/
yy_bp = yy_cp;
yy_current_state = yy_start;}
我有自己问题的答案。下面是对Solution
的一些解释- 我有两个.Lex (Type1_Lex.l & Type2_Lex.l)和两个.Yacc (Type1_Yacc.y & Type2_Yacc.y)代码
- 我正在编译所有相关的 .c(Type1_Lex.c、Type2_Lex.c、Type1_Yacc.c & Type2_Yacc.v)和 .h 文件正在生成
- 并进一步编译 .c 生成 Type1_Lex.o、Type2_Lex.o、Type1_Yacc.o Type2_Yacc.o
- 此外,我将所有这些目标文件放在一个 .a 中
问题就在这里
- ... ld:警告:符号“yy_create_buffer”的大小从 libuperbe.a(TYPE1_Lex 中的 318 更改而来。 o) libxxx.a 中的 208 (TYPE2_Lex.o)
ld:警告:符号“yy_load_buffer_state”的大小已从 libuperbe.a(TYPE1_Lex[ 中的 262 更改为=77=].o) 到 libxxx.a(TYPE2_Lex.o)
中的 146ld:警告:符号“yy_init_buffer”的大小已从 libuperbe.a(TYPE1_Lex[ 中的 278 更改为=77=].o) 到 libxxx.a(TYPE2_Lex.o)
中的 164生成的 .c 中有些符号相同 (TYPE1_Lex.c & TYPE2_Lex.c)
当两个目标文件绑定在一个.a中时类似 (yy_create_buffer,yy_init_buffer,yy_load_buffer_state) 符号得到 覆盖.
在 运行 时应调用方法 yy_create_buffer()、yy_init_buffer()、yy_load_buffer_state() 在 TYPE2_Lex.c 但实际上这些方法是从文件 TYPE1_Lex.c 中调用的,并且会导致内存损坏。
为了继续前进,我决定使用具有以下模式的 sed:
Sed TYPE2_Lex.c 与 :
- s/yy_create_buffer()/TYPE1_create_buffer/g
- s/yy_init_buffer()/TYPE1_init_buffer/g
- s/yy_load_buffer_state()/TYPE1_load_buffer_state/g
Sed TYPE2_Lex.c 与
- s/yy_create_buffer()/TYPE2_create_buffer/g
- s/yy_init_buffer()/TYPE2_init_buffer/g
- s/yy_load_buffer_state()/TYPE2_load_buffer_state/g
使Loader可以很容易的区分符号。并且在 运行 时,方法名称之间的混淆变为 null。
完成所有这些步骤后,我可以继续前进了:) 感谢大家的帮助:)