如何让GCC/Clang使用自定义库替代libgcc/compiler-rt?
用自定义低级运行时库替代libgcc或compiler-rt的方法
针对GCC的配置
GCC默认自动链接libgcc,要替换为自定义库,需结合以下编译/链接选项:
- 用
-nostdlib禁用默认标准库(含libgcc),但该选项会同时禁用其他标准库,若有额外依赖需手动指定链接 - 直接指定自定义库的路径与名称,例如你的库为
libmyrt.a且位于当前目录,编译命令如下:gcc -nostdlib -L./ -lmyrt your_code.c -o output - 若只需替换libgcc的特定例程、保留其余功能,可搭配
-ffreestanding与-nodefaultlibs,再手动链接自定义库和所需的libgcc子集:gcc -ffreestanding -nodefaultlibs -L./ -lmyrt -lgcc your_code.c -o output
针对Clang的配置
Clang默认使用compiler-rt,替换思路与GCC类似,细节如下:
- 先用
-nostdlib禁用默认的compiler-rt与标准库 - 手动链接自定义库,示例命令:
clang -nostdlib -L./ -lmyrt your_code.c -o output - 若Clang仍尝试链接compiler-rt,可添加
-fno-use-init-array和-fno-builtin减少默认依赖,再强制指定自定义库 - 如需保留部分compiler-rt功能,可使用
-ffreestanding,再手动链接自定义库与compiler-rt的必要组件:clang -ffreestanding -nodefaultlibs -L./ -lmyrt -lcrtbegin -lcrtend your_code.c -o output
关键注意事项
- 自定义库必须实现编译器依赖的所有必要低级例程,比如32位系统下的64位除法、浮点异常处理、C++异常所需的栈展开函数等,否则编译后的程序会出现未定义引用错误
- 可通过添加
-v编译选项查看编译器默认链接的库列表,对照确认需在自定义库中实现的函数 - 针对嵌入式或裸机场景,通常需配合
-ffreestanding或-fno-hosted,告知编译器无需假设存在完整操作系统环境
内容的提问来源于stack exchange,提问作者Andrej
相关产品推荐
相关产品推荐

