--group-start / --group-end 其实是 ld 链接器的一个功能,专门用来解决 循环依赖的静态库 问题。
例如:
1-Wl,--start-group -lfoo -lbar -lbaz -Wl,--end-group 2
会让链接器在这几个库之间反复扫描,直到符号解析完为止。
🔎 那么能不能用它来“优先选 1.0 而不是 1.1”?
答案是:不行,原因如下:
--start-group/--end-group只是解决静态库依赖次序的问题,不会影响动态库选择优先级。- 它能帮你在
libA.a依赖libB.a,而libB.a又依赖libA.a这种场景下成功链接。 - 但是它不会改变
libssl.so版本选择。
- 它能帮你在
- 动态库(
.so)的版本选择规则是:- 链接时:按
-L搜索路径的顺序找到的第一个匹配-lssl的库。 - 运行时:由 RPATH/RUNPATH + LD_LIBRARY_PATH + 系统默认搜索路径 决定。
- 这和 group 没关系。
- 链接时:按
- 所以如果你机器上
/usr/lib有libssl.so -> libssl.so.1.1,而你想用libssl.so.1.0.1,
那么即使写成:
1-Wl,--start-group -L/path/to/ssl101 -lsrosssl101 -L/usr/lib -lssl -Wl,--end-group
链接器依然可能拉错,因为 .so 是动态符号,最后由 搜索路径顺序 决定。
✅ 正确能保证 1.0 在前的方法
- 明确用绝对路径:
1$(OPENSSL101_LIBDIR)/libsrosssl101.so \ 2$(OPENSSL101_LIBDIR)/libsroscrypto101.so
这样就不会被 /usr/lib/libssl.so.1.1 抢走。
2. 确保 RPATH 先搜 1.0 路径:
1-Wl,-rpath,/usr/lib/openssl101 -Wl,-rpath,/usr/lib
这样运行时也会先加载 1.0。
3. shim/dlopen 隔离(我之前建议的方法 3):
这是彻底避免 1.1 被拖进来的办法。
👉 所以结论:
--group-start/--group-end 不能解决 OpenSSL 1.0 vs 1.1 的优先级问题,它只能解决静态库互相依赖的问题。
你要么用 绝对路径,要么用 RPATH 控制,或者直接上 shim 隔离。
《--group-start/--group-end 能不能解决 OpenSSL 1.0 vs 1.1 的优先级问题?》 是转载文章,点击查看原文。

