diff --git a/compiler/globtype.pas b/compiler/globtype.pas
index 8c1f6fbc53..505457cb86 100644
--- a/compiler/globtype.pas
+++ b/compiler/globtype.pas
@@ -44,6 +44,7 @@ interface
        TByteDynArray = array of byte;
        TAnsiCharDynArray = array of ansichar;
        TBooleanDynArray = array of boolean;
+       TWordDynArray = array of word;
 
        Int32 = Longint;
 
diff --git a/compiler/ogelf.pas b/compiler/ogelf.pas
index debeb837f2..cf44904bd6 100644
--- a/compiler/ogelf.pas
+++ b/compiler/ogelf.pas
@@ -135,7 +135,7 @@ interface
          symtaboffset: aword;
          syms: longword;
          localsyms: longword;
-         symversions: PWord;
+         symversions: TWordDynArray;
          dynobj: boolean;
          CObjSymbol: TObjSymbolClass;
          verdefs: TFPHashObjectList;
@@ -1168,8 +1168,7 @@ implementation
           FreeMem(FSecTbl);
         strtab:=nil;
         shstrtab:=nil;
-        if Assigned(symversions) then
-          FreeMem(symversions);
+        symversions:=nil;
         inherited Destroy;
       end;
 
@@ -1660,9 +1659,9 @@ implementation
                         InternalError(2012102004);
                       if shdrs[i].sh_size<>syms*sizeof(word) then
                         InternalError(2012102005);
-                      GetMem(symversions,shdrs[i].sh_size);
+                      SetLength(symversions,shdrs[i].sh_size);
                       FReader.seek(shdrs[i].sh_offset);
-                      FReader.read(symversions^,shdrs[i].sh_size);
+                      FReader.read(symversions[0],shdrs[i].sh_size);
                       if source_info.endian<>target_info.endian then
                         for j:=0 to syms-1 do
                           symversions[j]:=SwapEndian(symversions[j]);
@@ -2906,9 +2905,9 @@ implementation
         ver: TElfVersionDef;
         vn: TElfverneed;
         vna: TElfvernaux;
-        symversions: pword;
+        symversions: TWordDynArray;
       begin
-        symversions:=AllocMem((dynsymlist.count+1)*sizeof(word));
+        SetLength(symversions,(dynsymlist.count+1));
         { Assign version indices }
         idx:=VER_NDX_GLOBAL+1;
         for i:=0 to dynsymlist.count-1 do
@@ -2989,9 +2988,9 @@ implementation
             if source_info.endian<>target_info.endian then
               for i:=0 to dynsymlist.count+1 do
                 symversions[i]:=swapendian(symversions[i]);
-            symversec.write(symversions^,(dynsymlist.count+1)*sizeof(word));
+            symversec.write(symversions[0],(dynsymlist.count+1)*sizeof(word));
           end;
-        FreeMem(symversions);
+        symversions:=nil;
       end;