如何修改OpenWatcom中变量的默认符号映射规则?
全局修改Open Watcom变量默认符号映射规则
Open Watcom中,#pragma aux default指令默认仅对函数生效,可指定函数的默认符号名生成规则,但变量不会受此指令影响。以下是原示例及编译验证:
示例代码
/* prog.c */ #pragma aux default "__*__" extern int mysym1; extern int mysym2(int x); int mysym3(void) { return mysym2(mysym1); }
编译及反汇编结果
$ owcc -c -o prog.obj prog.c $ wdis prog.obj | grep mysym 0000 __mysym3__: 000A A1 00 00 00 00 mov eax,_mysym1 000F E9 00 00 00 00 jmp __mysym2__
可见函数mysym2、mysym3被加上首尾双下划线,但变量mysym1仍为_mysym1,未受指令影响。要全局修改所有变量的默认符号映射规则,可采用以下两种方案:
方案1:代码内指定全局变量规则
使用#pragma aux default data指令单独针对变量设置全局符号生成规则,与函数规则配置结合:
/* prog.c */ #pragma aux default "__*__" // 统一函数的符号修饰规则 #pragma aux default data "__*__" // 统一变量的符号修饰规则 extern int mysym1; extern int mysym2(int x); int mysym3(void) { return mysym2(mysym1); }
重新编译后,变量mysym1的符号会变为__mysym1__,与函数的修饰规则保持一致。
方案2:编译器命令行选项
无需修改代码,通过owcc的-zn选项直接指定变量的默认符号修饰模式:
$ owcc -c -zn__*__ -o prog.obj prog.c
若需要同时统一函数和变量的符号规则,可搭配函数对应的-zf选项:
$ owcc -c -zf__*__ -zn__*__ -o prog.obj prog.c
内容的提问来源于stack exchange,提问作者pts
相关产品推荐
相关产品推荐

