惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

S
SegmentFault 最新的问题
博客园 - 三生石上(FineUI控件)
WordPress大学
WordPress大学
博客园 - 【当耐特】
月光博客
月光博客
Vercel News
Vercel News
D
Docker
I
InfoQ
Apple Machine Learning Research
Apple Machine Learning Research
博客园 - 叶小钗
MongoDB | Blog
MongoDB | Blog
GbyAI
GbyAI
有赞技术团队
有赞技术团队
雷峰网
雷峰网
博客园 - 聂微东
小众软件
小众软件
Y
Y Combinator Blog
腾讯CDC
L
LangChain Blog
The GitHub Blog
The GitHub Blog
宝玉的分享
宝玉的分享
Stack Overflow Blog
Stack Overflow Blog
大猫的无限游戏
大猫的无限游戏
T
The Blog of Author Tim Ferriss

博客园 - 秋·风

修复lazarus datetimepicker控件在linux下拉不能选择日期的bug 用fpc trunk编译lazarus控件找不到TTimeZone 在银河麒麟v10操作系统应用程序执行遇到“权限不够”的提示 修复pl_cindy的Panel系列控件在gtk3出错的bug 龙芯 3A4000工具链的编译(mingw64) lazarus 4.8及之前的版本QT5中文输入多字词组时只输入前2个中文 修正lazarus在GTK3下的Synedit只能输入2个中文字符的Bug lazarus trunk linux从2026.07.02开始,LCLWidgetType默认使用gtk3,怎样改回gtk2 【aarch64-win64】DonAlfredo终于修复fpc将TSmallPoint赋值为一个负数,并将TSmallPoint赋值给TPoint时得到一个655xx的数值的bug lazarus编译时提示链接出错的处理方法 mORMot2两个BUG 【aarch64-win64】发现fpc aarch64-win64 将TSmallPoint赋值为一个负数,并赋值给TPoint时得到一个655xx的数值的bug 修复aarch64 win64下lazarus不弹出SourceTabPopUpMenu fpc aarch64-win64版编译应用时遇到一个奇怪的bug 在windows 11 on arm64系统编译lazarus出错的处理方法 修复TDBMemo只读不能使用Ctrl+C复制文字的Bug freepascal打补丁后已支持windows 11 on arm64(lazarus aarch64 windows版也可以运行了) 查看libc.so.6的版本号 Lazarus移动版启动程序 lazarus鸿蒙开发13:使用鸿蒙原生API画图--lazarus侧关键代码 lazarus鸿蒙开发12:使用鸿蒙原生API画图--鸿蒙侧关键代码 lazarus鸿蒙开发11:使用鸿蒙原生接口画图 lazarus鸿蒙开发10:lazarus一键编译、打包助手 lazarus鸿蒙开发9:使用命令行编译DevEco Studio应用 lazarus鸿蒙开发8:在DevEco Studio的日志窗口显示日志信息 lazarus鸿蒙开发7:在 Windows 上为 OpenHarmony (LoongArch64) 编译 Qt 5.15.12 SDK 指南 lazarus鸿蒙开发6:鸿蒙project配置 lazarus鸿蒙开发5:编译ohos_hap_project lazarus鸿蒙开发4:编译OHOS_QT_Lazarus lazarus鸿蒙开发3:编译libLazarusOHOS_Wrapper.so
fpc 3.2.2交叉编译i386-linux链接出错
秋·风 · 2026-06-16 · via 博客园 - 秋·风

fpc 3.2.2交叉编译i386-linux链接出错,原以为是cross的lib问题,查询发现是:
FPC 3.2.2 的源码文件 fpcsrc/rtl/linux/i386/si_c21.inc ,它引用了 __libc_csu_init 和 __libc_csu_fini 这两个函数。然而,在较新的 glibc 版本(如 2.34 及更高)中,这些符号已经被移除或不再公开导出。
因此,当 FPC 3.2.2 在链接时试图引用这些不存在的符号时,链接器就会报错。

project1.lpr(28,1) Warning: "crtn.o" not found, this will probably cause a linking failure
C:\QFLazarus_x86_64_win64\cross\bin-x86_64-win64\i386-linux\i386-linux-gnu-ld.exe: C:\Temp\project1: hidden symbol `__init_array_end' isn't defined
C:\QFLazarus_x86_64_win64\cross\bin-x86_64-win64\i386-linux\i386-linux-gnu-ld.exe: final link failed: bad value
project1.lpr(28,1) Error: Error while linking

QQ_1781612216835

解决方案:
1、升级 FPC 版本:这是最直接的解决方法。FPC 的开发者在 3.2.3 及更新的版本(包括 3.3.1)中已经修复了此问题
2、用新版si_c21.inc替换。
修复si_s21.inc后,重新编译i386-linux的交叉编译环境,然后编译应用就可以。
修复后编译已正常:

QQ_1781613050073

这是patch:

diff -urN 1\si_c21.inc 2\si_c21.inc
--- 1\si_c21.inc    Sat May 15 23:38:31 2021
+++ 2\si_c21.inc    Tue Jun 16 19:07:37 2026
@@ -35,12 +35,13 @@
 
 {$asmmode att}
 
-procedure __libc_csu_init; cdecl; external;
-procedure __libc_csu_fini; cdecl; external;
+procedure ini_dummy;
+  begin
+  end;
+
 procedure libc_start_main; external name '__libc_start_main';
 procedure libc_exit(code: longint); cdecl; external name 'exit';
 
-
 {******************************************************************************
                        glibc 2.1 lib + profiling start/halt
  ******************************************************************************}
@@ -81,20 +82,20 @@
   {$endif FPC_PIC}
 
         { int __libc_start_main(
-        int *(main) (int, char * *, char * *), 
-        int argc, 
-        char * * ubp_av, 
-        void (*init) (void), 
-        void (*fini) (void), 
-        void (*rtld_fini) (void), 
-        void (* stack_end)); } 
+        int *(main) (int, char **, char **),
+        int argc,
+        AnsiChar * * ubp_av,
+        void (*init) (void),
+        void (*fini) (void),
+        void (*rtld_fini) (void),
+        void (* stack_end)); }
 
         pushl %ebp               { padding }
         pushl %esp               { stack_end }
         pushl %edx               { function to be registered with
                                     atexit(), passed by loader }
-        pushl $__libc_csu_fini
-        pushl $__libc_csu_init
+        pushl $ini_dummy
+        pushl $ini_dummy
         pushl %esi                      { Push second argument: argv.  }
         pushl %ecx                      { Push first argument: argc.  }