如何在IBM z/OS中通过xlc编译器从C代码创建加载模块
问题解答
1. 当前生成的lib/func1.o是否为加载模块?
不是。你生成的lib/func1.o是可重定位目标模块,仅包含编译后的机器码和未解析的符号引用,无法直接被z/OS系统加载执行,只能作为链接阶段的输入文件。你用cob2编译COBOL程序时,实际是cob2调用链接器,将COBOL目标模块与func1.o合并链接成了可执行的加载模块test。
2. 用xlc在Unix Shell中创建加载模块的方法
在z/OS USS(Unix System Services)环境下,可通过xlc结合链接器参数生成加载模块,具体有两种常用方式:
方式一:单步编译+链接生成加载模块
若你的C代码包含main函数(是完整可执行程序),可直接一步完成编译与链接:
xlc -o my_load_module src/func1.c
生成的my_load_module就是标准z/OS加载模块,可直接在USS中执行,或被其他程序调用。
方式二:先编译目标模块,再链接生成加载模块
如果已有编译好的目标模块(如你现有的obj/func1.o),可通过xlc传递链接器参数生成加载模块:
xlc -o lib/func1.loadmod obj/func1.o -Wl,/LOAD
-Wl,/LOAD:将/LOAD参数传递给链接器,明确要求生成加载模块(而非共享对象或可重定位模块)- 最终生成的
func1.loadmod是独立的加载模块
补充:适配COBOL调用的加载模块配置
若你的C模块是供COBOL调用的子程序,需额外注意两点:
- 在C代码中声明兼容COBOL的调用约定:
#pragma linkage(func1, COBOL) void func1() { // 函数逻辑 }
- 链接时可指定可重入属性(适合多任务环境):
xlc -o lib/func1.loadmod obj/func1.o -Wl,/LOAD,/RENT
内容的提问来源于stack exchange,提问作者mysiar
相关产品推荐
相关产品推荐

