Catalog · How the catalog works
InternetComponentSuite
Overbyte ICS V9.8A - CSL fork: FPC 3.2.2+ / Lazarus compatibility (additive IFDEF FPC guards; Delphi 13 / C++Builder branch untouched).
- ★ 1 on GitHub
Anyone may press Interesting, signed in or not. It helps others find this project.
README
Internet Component Suite (ICS) — Fork CSL 9.8A (FPC 3.2.2+ / Lazarus)
Porte do Overbyte ICS V9.8 (Internet Component Suite, de François Piette / Overbyte —
IcsVerLitNum 908, sincronizado com o upstream a 2026-07-28) para Free Pascal 3.2.2+ /
Lazarus, mantendo o ramo Delphi 13 / C++Builder intacto.
Revisão do fork CSL: 9.8A — ICS V9.8 (upstream) + revisão CSL A (a 1ª): compatibilidade
FPC 3.2.2 e 3.3.1 (win32/win64) com SSL/TLS, objectos zlib zobj1321 (1.3.2.1), matriz 100%.
Regra de ouro: todas as alterações de compatibilidade são aditivas e guardadas por
{$IFDEF FPC}. O caminho Delphi/C++Builder fica verbatim — nenhum comportamento existente muda.
Estado (o que funciona)
| Alvo | Compila | Liga | Corre | SSL/TLS |
|---|---|---|---|---|
| Delphi 13 win32 | ✅ | ✅ | ✅ | ✅ (intacto) |
| Delphi 13 win64 | ✅ | ✅ | ✅ | ✅ (intacto) |
| FPC 3.3.1 win32 | ✅ | ✅ | ✅ | ✅ |
| FPC 3.3.1 win64 | ✅ | ✅ | ✅ | ✅ |
| FPC 3.2.2 win32 | ✅ | ✅ | ✅ | ✅ |
| FPC 3.2.2 win64 | ✅ | ✅ | ✅ | ✅² |
² Resolvido a 2026-07-28 (antes constava como "ICE 200603061 — usar 3.3.1"). O diagnóstico
final provou que o SSL nunca foi o culpado: o Internal error 200603061 era do linker
interno COFF do FPC 3.2.2 win64 (ogcoff.pas) ao processar os objectos zlib do mingw-w64
— que só entravam no link porque TSslHttpRest → HttpProt → ZlibHigh → ZLibObj os puxa (um
programa sem SSL nenhum que use zlib dava exactamente o mesmo ICE). Duas causas nos .o:
as secções SEH .pdata/.xdata, e sobretudo os stubs COMDAT .rdata$.refptr.* duplicados
entre TUs — no fold das duplicatas o linker 3.2.2 não redireciona as relocs para a cópia
sobrevivente e aborta ("reloc pointing to unused section"). Fix nos objectos (zero mudanças
de código): -fno-asynchronous-unwind-tables + objcopy --rename-section/--redefine-sym para
tornar cada refptr única por unit — ver tools/Build-Zlib1321Objs.ps1. Validado por round-trip
zlib e cadeia SSL completa (TSslWSocket+TSslHttpRest) nos 4 alvos FPC + dcc32/dcc64.
Reprodução: o build directo por fpc no 3.2.2 exige -MDelphiUnicode (caso contrário o
scanner de comentários aninhados aborta com "Unexpected end of file"); o .lpk/lazbuild já o
garante via SyntaxMode=Delphi.
- 107 units compilam no pacote runtime Lazarus (
Packages/Lazarus/IcsCommonPkg.lpk), incluindo a cadeia SSL (TSslWSocket, binding OpenSSL). - Runtime validado por consumidor real (
Packages/Lazarus/test/icstest) que instanciaTSslWSockete liga com SSL, vialazbuild+ FPC 3.3.1. - Design-time (paleta Lazarus): pendente — porte de
OverbyteIcsRegpara LCL +IcsLcl.lpk.
Pré-requisitos
| Dependência | Uso |
|---|---|
Delphi 13 (dcc32/dcc64, RAD Studio) |
build do ramo Delphi (opcional) |
| FPC 3.2.2 ou 3.3.1 (win32 e win64) | build do ramo FPC (3.3.1 recomendado; 3.2.2 100% desde o fix do ICE) |
Lazarus (lazbuild) |
build do pacote .lpk e consumidores |
| mingw-w64 gcc | só se for preciso regenerar os objectos zlib .o (ver abaixo) |
| OpenSSL 3.x / 4.x DLLs | carregadas em runtime (não em compile-time) para SSL/TLS |
JEDI (winunits-jedi) · FPMasks (fpindexer) |
units de sistema/máscaras usadas por alguns módulos |
Os toolchains (deps/), DLLs OpenSSL (dll/), objectos compilados (Lib/) e saídas de build
(_fpcbuild/) não estão neste repositório (ver .gitignore) — são pré-requisitos externos.
A compatibilização FPC — como foi feita
1. Peça-chave: Source/Include/OverbyteIcsDefs.inc
Toda a base do porte assenta neste include (carregado por todas as units):
Directiva (sob {$IFDEF FPC}) |
Porquê |
|---|---|
{$MODE DELPHIUNICODE} (guardado por ICS_FPC_MODE_SET) |
String = UnicodeString, Char = WideChar, PChar = PWideChar — alinha o modelo de strings com o Delphi moderno. Guard include-once porque o .inc é re-incluído várias vezes por unit e o {$MODE} é posicional no FPC. |
{$DEFINE UNICODE} |
activa os caminhos de código Unicode do ICS (iguais ao Delphi ≥ 2009). |
{$UNDEF RTL_NAMESPACES} |
o FPC não tem dotted unit scope names (Winapi.*, System.*) — sem isto: "Can't find unit Winapi.Windows". |
SSL ON por omissão (escape ICS_FPC_NO_SSL) |
o ICS original desligava SSL no FPC; com a base DELPHIUNICODE a cadeia TSslWSocket/OpenSSL compila. Define ICS_FPC_NO_SSL para voltar a desligar. |
2. Shims RTL (FPC-only) — Source/Helpers/
Preenchem lacunas da RTL do FPC face à do Delphi, sem tocar nas call sites:
| Shim | Substitui | Fornece |
|---|---|---|
OverbyteIcsFpcIOUtils.pas |
System.IOUtils |
TFile (Exists/ReadAllText/WriteAllText), TPath (GetDirectoryName/Combine/…) |
AnsiStrings.pas |
System.AnsiStrings |
StrLen/StrCopy/StrLComp (PAnsiChar e PWideChar)/PosEx — mantém o nome de unit AnsiStrings para as chamadas qualificadas resolverem |
OverbyteIcsFpcStrUtils.pas |
overloads de IfThen |
IfThen para tipos em falta |
OverbyteIcsFpc.inc |
— | defines de feature (FPC_USE_GENERICS_COLLECTIONS, FPC_RTTI_GETATTRIBUTES) |
3. Objectos zlib — Source/zobj1321/ (zlib 1.3.2.1)
O OverbyteIcsZLibObj.pas linka a zlib como objectos (sem DLL externa). Desde 28/07 os {$L}
apontam para zobj1321/ (zlib 1.3.2.1-motley recompilada de sdk/zlib) em ambos os
ramos, gerada por tools/Build-Zlib1321Objs.ps1:
- win32
.obj(Delphi):bcc32c -c -O2→ OMF. - win32
.o(FPC): mingw-w64 gcc-m32→ COFF-i386. - win64
.o/.obj(FPC e Delphi): mingw-w64 gcc-m64 -fno-asynchronous-unwind-tables→ COFF x64, com pós-processamento objcopy que torna os stubs COMDAT.refptr.*únicos por unit — o fix doICE 200603061do linker interno FPC 3.2.2 win64 (ver nota ² acima). - Ligados sob
{$IFDEF FPC}com{$L …o}+{$LINKLIB gcc}{$LINKLIB msvcrt}; no FPC win64 o recordz_streamganhou um pad aditivo (o C alinha a 88 bytes; sem eledeflateInit_devolviaZ_VERSION_ERROR). - A pasta
Source/zobj1212/mantém os objectos originais do ICS (zlib 1.2.12;.objzlibpas de Gabriel Corneanu) — intactos, como referência/fallback.
4. Catálogo de padrões aplicados (47 ficheiros modificados)
Todas as edições são {$IFDEF FPC} aditivas. Os padrões recorrentes:
| Padrão | Problema → solução |
|---|---|
| P-NS | namespaces dotted / units só-Delphi → Masks→FPMasks, PsApi→JwaPsApi, WinSvc→JwaWinSvc, IOUtils/AnsiStrings→shims |
| P-APIW | APIs Win32 “planas” (ANSI) resolvem mal na base Unicode → variantes …W explícitas (CreateFileW, LoadLibraryW, RegOpenKeyExW…) |
| P-CV | {$IF CompilerVersion …} inexistente no FPC → {$IFDEF FPC} equivalente |
| P-RTLSTR | overrides de RTL que exigem AnsiString (ex.: GetDisplayName, TCustomIniFile) |
| P-322RTL | lacunas da RTL 3.2.2 (UnicodeFromLocaleChars→MultiByteToWideChar, TInterlocked→InterlockedCompareExchange, AtomicIncrement) |
| P-ZLIB | .obj Delphi não linka no FPC → .o mingw + {$LINKLIB} |
| P-DUPDECL | Extended = Double no win64 colide em redeclarações → guard {$IF … FPC_HAS_TYPE_EXTENDED} |
Detalhe completo (ficheiro a ficheiro, com o diff literal) em:
.workspace/reports/ics-fpc-customizacoes-relatorio_v1.0.md— manual de reprodução (10 secções).workspace/reports/ics-fpc-diff-por-ficheiro.md— os 47 ficheiros, um a um, com finalidade + hunks.workspace/reports/ics-fpc-customizacoes.patch— diff literal cru (svn diff)
Como compilar (FPC / Lazarus)
Pacote runtime (recomendado — resolve os paths de source, include e objectos):
lazbuild Packages\Lazarus\IcsCommonPkg.lpkConsumidor de exemplo (instancia TSslWSocket, liga com SSL):
lazbuild Packages\Lazarus\test\icstest.lpi
.\Packages\Lazarus\test\icstest.exeCaveat 3.3.1: com o internal linker + DWARF ligados houve "Compilation raised exception internally"; compilar com debug OFF (
-g-) — já configurado no.lpido teste.
Regenerar os objectos zlib .o (só se sdk/zlib mudar de versão):
powershell -ExecutionPolicy Bypass -File tools\Build-Zlib1321Objs.ps1Estrutura relevante
Source/ units ICS (.pas) — com guards {$IFDEF FPC} aditivos
├── Include/OverbyteIcsDefs.inc ← peça-chave do porte
├── Helpers/ ← shims RTL FPC-only (NOVOS)
└── zobj1321/ ← objectos zlib 1.3.2.1 (.obj Delphi + .o FPC; zobj1212 = originais ICS)
Packages/Lazarus/ IcsCommonPkg.lpk (runtime) + test/ (consumidor)
tools/Build-Zlib1321Objs.ps1 gera os objectos zlib 1.3.2.1 (.o FPC + .obj Delphi)
.workspace/reports/ relatórios detalhados do porteCréditos e licença
- Overbyte ICS © 1996–2026 François Piette / Overbyte — licença original do ICS
(ver
ReadMe9.txte cabeçalhos das units). Componentes mantidos por Angus Robertson. - zlib © Jean-loup Gailly & Mark Adler; objectos
.objde zlibpas (Gabriel Corneanu). - Porte FPC 3.3.1 / Lazarus: CSL Softwares (ProvidersORM v3) — alterações aditivas
{$IFDEF FPC}.
Este fork preserva a licença original do ICS. As alterações de compatibilidade FPC são contribuições aditivas e não alteram os termos de uso do ICS a montante.

