You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GNU ld linker: stack-size参数无效,如何在程序启动前设置栈大小?

解决Linux下程序启动前设置栈大小的问题

为什么-Wl,-z,stack-size=<value>不生效?

在Linux系统中,链接器的stack-size选项仅设置ELF文件的栈大小标记,但内核会优先遵循进程的RLIMIT_STACK资源限制。系统默认的栈大小限制(通常为8MB)会覆盖这个链接器设置,所以你编译后运行程序,输出的还是默认栈大小值。

可行的程序启动前设置方案

1. 用prlimit命令临时单进程设置

prlimit可针对单个进程设置资源限制,不会影响当前shell的全局设置,无需重启终端:

prlimit --stack=<value> -- ./program

例如设置栈大小为4MB(单位为字节,4MB对应4194304):

prlimit --stack=4194304 -- ./program

运行后程序会输出4194304 4294967295,且当前shell的其他命令不受影响。

2. 编写启动脚本包装

若需频繁运行,可写一个简单的bash脚本(比如run_program.sh):

#!/bin/bash
prlimit --stack=4194304 -- ./program

给脚本添加执行权限:

chmod +x run_program.sh

之后直接运行脚本,每次启动都会自动为目标程序设置指定栈大小。

3. 修改用户级默认限制(永久生效)

若希望该用户下所有新启动进程都使用指定栈大小,可编辑/etc/security/limits.conf文件(需sudo权限),添加一行:

username soft stack 4194304

将username替换为你的实际用户名,4194304为目标栈大小(字节)。保存后重新登录系统,新启动进程的默认栈大小会变为设置值,运行你的程序即可看到对应输出。

4. 临时环境变量+ulimit(仅当前命令生效)

可在同一行中临时设置ulimit并运行程序,不会改变当前shell的全局设置:

ulimit -s 4096 && ./program

这里4096是KB单位,对应4MB。运行完该命令后,当前shell的ulimit设置仍为默认值,不影响后续命令。

验证代码

你的验证代码可保留,用于确认栈大小是否生效:

#include <stdio.h>
#include <sys/resource.h>
static struct rlimit Rl;
int main() {
    getrlimit(RLIMIT_STACK, &Rl);
    printf("%lu %lu\n", Rl.rlim_cur, Rl.rlim_max);
    return 0;
}

内容的提问来源于stack exchange,提问作者user2538003

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 09:30:07