[fpc-devel] Bug in generation command line for linker.

Bishop bishop-fpc at catcompany.org
Sun Apr 12 20:06:07 CEST 2026


In the process of cross-compiling from Win64 to Solaris, I came across a 
situation where the compiler created a damaged program file. Conducted 
research on the problem. Since my English proficiency is not very good, 
but I asked the AI to formulate a bug report in English:

Subject: Potential filename truncation in Linker Script generation 
(t_sunos, t_linux, t_bsd)

Description:
While cross-compiling from Win64 to Oracle Solaris, I discovered that 
the generated linker command line contains corrupted paths. 
Specifically, the -Map file path is truncated to exactly 40 characters 
(or less, appearing as 8.3-like truncation in some cases), leading to 
collisions where the Map file and the Output binary have the same name, 
resulting in a corrupted executable.

Root Cause:
The issue lies in several linker modules where command-line fragments 
are stored in fixed-length strings (e.g., string[40], string[60]). When 
the project is located in a deep directory structure (common in Windows 
environments), the path plus the linker flag exceeds this limit and is 
silently truncated.

Affected files and variables:
     compiler/systems/t_sunos.pas:
         StripStr, StaticStr, RedirectStr are declared as string[40].
         DynLinkStr is declared as string[60].
     compiler/systems/t_linux.pas:
         StripStr, StaticStr, GCSectionsStr are declared as string[40].
     compiler/systems/t_bsd.pas:
         StripStr, StaticStr, GCSectionsStr are declared as string[63].
         DynLinkStr is declared as string[60].

Steps to reproduce:
     Create a project in a deep directory (e.g., path length > 35 chars).
     Enable Map file generation (-Xm).
     Cross-compile for Solaris/Linux/BSD.
     Observe the linker call via -vt: the -Map argument will be truncated.

Suggested Fix:
Replace fixed-length string declarations (string[N]) with TCmdStr in the 
MakeExecutable and MakeSharedLibrary methods of the affected units.

P.S. My path for output binary was 
"D:\Work\CFW_RTL\DevHelpers\H1_Stack". Not so long, but already give 
problem.


More information about the fpc-devel mailing list