View previous topic :: View next topic |
Author |
Message |
DietmarSiepmann
Joined: 03 Jun 2013 Posts: 279
|
Posted: Wed Mar 28, 2018 2:43 pm Post subject: Create static libraries? |
|
|
Hello,
I have learnt that slink64 (of ftn95 version 8.30) supports creating static libraries. Unfortunately I have not found any information/help how this would be done.
Having created a 64 bit object file xx.obj I tried calling slink64 with commands
archive xx.lib
addobj xx.obj
file
. However, this did not work, slink64 crashed with an access violation and displayed the follwing lines:
Comment: The 'archive' and 'addobj' commands are redundant
Loading C:\ds\sublib\salford64\xx.obj
Executing the same sequence of commands with slink (and a 32 bit object added) worked successfully and produced a static library xx.lib as expected. Moreover I am interested in the command line form of this command (using -archive:xx.lib etc.) which should be
slink64.exe -archive:xx.lib -addobj:xx.obj
Again this command produces no lib file but displays
[SLINK64 v2.01, Copyright (c) Silverfrost Ltd. 2015-2018]
***archive:xx.lib - unknown command.
How would I create a static library using slink64?
Thanks for any advice ...
Regards,
Dietmar |
|
Back to top |
|
|
PaulLaidler Site Admin
Joined: 21 Feb 2005 Posts: 7932 Location: Salford, UK
|
Posted: Wed Mar 28, 2018 3:06 pm Post subject: |
|
|
Dietmar
Information is provided in ftn95.chm under x64 platform->Using the 64 bit linker.
Basically you just need to specify the correct extension. The default extension for a static library is .sl64 but you can use .lib if you prefer.
It is intended that you should be able to use some of the old SLINK commands, particularly in interactive mode. I will take a look at the ones that you have mentioned. |
|
Back to top |
|
|
PaulLaidler Site Admin
Joined: 21 Feb 2005 Posts: 7932 Location: Salford, UK
|
Posted: Wed Mar 28, 2018 3:15 pm Post subject: |
|
|
I think that you will find that it works if you use "archive" without the file name following.
I will make a note that the crash needs to be fixed. |
|
Back to top |
|
|
DietmarSiepmann
Joined: 03 Jun 2013 Posts: 279
|
Posted: Wed Mar 28, 2018 3:42 pm Post subject: |
|
|
Paul,
having read in the documentation (file ftn95.chm) commands
lo xx.obj
file xx.sl64
should work for slink64, shouldn't they? But they do not.
Also removing the filename in the archive command does not work. To me it seems that the file command within slink64 produces the error. I am very interested in creating static libraries no matter how this would be done.
Regards,
Dietmar |
|
Back to top |
|
|
PaulLaidler Site Admin
Joined: 21 Feb 2005 Posts: 7932 Location: Salford, UK
|
Posted: Wed Mar 28, 2018 3:58 pm Post subject: |
|
|
It works for me.
Are you using SLINK64 v2.01?
I tested both .sl64 and .lib. |
|
Back to top |
|
|
DietmarSiepmann
Joined: 03 Jun 2013 Posts: 279
|
Posted: Thu Mar 29, 2018 11:07 am Post subject: |
|
|
Paul,
I used slink64 version 2.101 (Version string of slink64 call: [SLINK64 v2.01, Copyright (c) Silverfrost Ltd. 2015-2018]); I checked that the correct salflibc.dll was loaded by sdbg64 and it was (version id 20.3.16.7).
However, meanwhile I observed another phenomenon: I created a small sample (test_link.for) outside of our build environment for which I was able to create a lib in the way you suggested (compiling it to test_link.obj and then using slink64 to produce test_link.sl64).
In our build enviroment this mechanism does not work as I said. This is strange because I tried to create the library from a source file which had been compiled correctly to an object file and which could be linked to produce the final exe file. The compilation step did not produce any errors, but some warnings which I ignored. It is probably the object file which creates the problem for if I substitute it by test_link.obj, then the process works and produces the library intended.
I need to compare how the compilation steps differ.
Regards,
Dietmar |
|
Back to top |
|
|
DietmarSiepmann
Joined: 03 Jun 2013 Posts: 279
|
Posted: Tue Apr 03, 2018 3:49 pm Post subject: |
|
|
Paul,
meanwhile I could produce a sample where slink64 fails although an object file had been generated successfully.
Code: |
C Program generated
SUBROUTINE SR1
*(KSTEU)
INTEGER*2 MYI2_1
INTEGER*2 MYI2_2
...
INTEGER*2 MYI2_94
INTEGER*2 MYI2_95
MYI2_1=1_2
MYI2_2=1_2
...
MYI2_94=1_2
MYI2_95=1_2
return
end
|
Here ... means the corresponding statements to j=1 for j=3,4,5,...,92,93, respectively. The programme is named test_generated.for. Compiling via Code: |
ftn95 test_generated /64 /ALL_WARNINGS/NON_STANDARD/SINGLE_THREADED/OLD_ARRAYS/ALT_KINDS/PERSIST/UNLIMITED_ERRORS/FIXED_FORMAT/SAVE/NO_WARN73/WIDE_SOURCE
|
creates file test_generated.obj the size of which is 4.093 Bytes. Now trying to link via command
Code: |
slink64 test_generated.lnk |
with file test_generated.lnk defined as
Code: |
lo test_generated.obj
file test_generated.lib
|
results in a crash producing error file
Code: |
Access Violation
The instruction at address 100174fc attempted to read from location 102c1019
1001743c read_bytes#2C [+00c0]
10017716 __read [+02c3]
1001d980 fread [+02b3]
0040894c build_static_library(void) [+0148]
00401000 main [+0f90]
eax=00001000 ebx=00000007 ecx=102c101a
edx=00000000 esi=00000007 edi=1018d644
ebp=0365eae0 esp=0365ea9c IOPL=1
ds=002b es=002b fs=0053
gs=002b cs=0023 ss=002b
flgs=00010212 [NC OP NZ SN DN NV]
100174fc movb dl,[ecx-0x1]
100174ff movb [ebp-0x15],dl
10017502 mov ebx,[ebp+0x8]
|
If you omit the 2 statements containing MYI2_95 in test_generated.for, the slink64 command is successful and creates archive test_generated.lib as expected.
Regards,
Dietmar |
|
Back to top |
|
|
PaulLaidler Site Admin
Joined: 21 Feb 2005 Posts: 7932 Location: Salford, UK
|
Posted: Thu Apr 05, 2018 9:17 am Post subject: |
|
|
Dietmar
I have tested your latest sample and it works OK for me.
I don't know why. I am using FTN95 v8.30 and SLINK64 v2.01. |
|
Back to top |
|
|
DietmarSiepmann
Joined: 03 Jun 2013 Posts: 279
|
Posted: Mon Apr 09, 2018 12:37 pm Post subject: |
|
|
Paul,
did you use the ftn95 Options mentioned above? I found that commands Code: |
ftn95 test_generated /64 /FIXED_FORMAT
slink64 test_generated.lnk
|
work and create the library expected, however, commands Code: |
ftn95 test_generated /64 /FIXED_FORMAT/SAVE
slink64 test_generated.lnk
|
do not work and produce the "Access Violation" error.
Regards,
Dietmar |
|
Back to top |
|
|
PaulLaidler Site Admin
Joined: 21 Feb 2005 Posts: 7932 Location: Salford, UK
|
Posted: Mon Apr 09, 2018 3:02 pm Post subject: |
|
|
Dietmar
It works for me with /SAVE and /FIXED.
I also tried FTN95 v8.20 and FTN95 v8.30 and it still works OK.
(My initial test was on the current developers' version.)
I anyone else willing to test this on their machine? |
|
Back to top |
|
|
JohnCampbell
Joined: 16 Feb 2006 Posts: 2556 Location: Sydney
|
Posted: Tue Apr 10, 2018 2:05 am Post subject: |
|
|
I have managed to get the test to work with Ver 8.30.
It takes a few files to build and run:
The library code : test_generated.for Code: | ! test_generated.for
!
! sample library routine
!
SUBROUTINE SR1
* (KSTEU)
integer ksteu
INTEGER*2 MYI2_1
INTEGER*2 MYI2_2
! ...
INTEGER*2 MYI2_94
INTEGER*2 MYI2_95
MYI2_1=1_2
MYI2_2=1_2
! ...
MYI2_94=1_2
MYI2_95=1_2
KSTEU = 42
return
end |
The program to use the library : use_lib.for Code: | ! use_lib.for to user the library
!
C Program generated
integer ksteu
call SR1 (ksteu)
write (*,*) 'The number is :',ksteu
end
|
The slink file to build the library : test_gen.txt Code: | lo test_generated.obj
file test_generated.sl64 |
The slink file to build the program : test_use.txt Code: | lo use_lib.obj
lo test_generated.sl64
file use.exe |
The batch file to do the test : build_gen.bat Code: | del *.obj
del *.sl64
ftn95 test_generated /64 /ALL_WARNINGS/NON_STANDARD/SINGLE_THREADED/OLD_ARRAYS/ALT_KINDS/PERSIST/UNLIMITED_ERRORS/FIXED_FORMAT/SAVE/NO_WARN73/WIDE_SOURCE
slink64 @test_gen.txt
del test_generated.obj
ftn95 use_lib /64 /ALL_WARNINGS/NON_STANDARD/SINGLE_THREADED/OLD_ARRAYS/ALT_KINDS/PERSIST/UNLIMITED_ERRORS/FIXED_FORMAT/SAVE/NO_WARN73/WIDE_SOURCE
slink64 @test_use.txt
use |
This worked for me, I hope it is correct
John |
|
Back to top |
|
|
JohnCampbell
Joined: 16 Feb 2006 Posts: 2556 Location: Sydney
|
Posted: Tue Apr 10, 2018 2:20 am Post subject: |
|
|
I expanded on the test with:
an extra library : test_gen2.for Code: | ! test_gen2.for
!
! sample library routine
!
SUBROUTINE SR2
* (KSTEU)
integer ksteu
INTEGER*2 MYI2_1
INTEGER*2 MYI2_2
! ...
INTEGER*2 MYI2_94
INTEGER*2 MYI2_95
MYI2_1=1_2
MYI2_2=1_2
! ...
MYI2_94=1_2
MYI2_95=1_2
KSTEU = 24
return
end |
a new slink libarary build : test_gen.txt Code: | lo test_generated.obj
lo test_gen2.obj
file test_generated.sl64 |
a new use program : use_lib.for Code: | ! use_lib.for to user the library
!
C Program generated
integer ksteu
call SR1 (ksteu)
write (*,*) 'The number is :',ksteu
call SR2 (ksteu)
write (*,*) 'The number is :',ksteu
end
|
a new slink for use : test_use.txt Code: | lo use_lib.obj
lo test_generated.sl64
map use.map
file use.exe |
and build : build_gen.bat Code: | del *.obj
del *.sl64
ftn95 test_generated /64 /ALL_WARNINGS/NON_STANDARD/SINGLE_THREADED/OLD_ARRAYS/ALT_KINDS/PERSIST/UNLIMITED_ERRORS/FIXED_FORMAT/SAVE/NO_WARN73/WIDE_SOURCE
ftn95 test_gen2 /64 /ALL_WARNINGS/NON_STANDARD/SINGLE_THREADED/OLD_ARRAYS/ALT_KINDS/PERSIST/UNLIMITED_ERRORS/FIXED_FORMAT/SAVE/NO_WARN73/WIDE_SOURCE
slink64 @test_gen.txt
del test_generated.obj
ftn95 use_lib /64 /ALL_WARNINGS/NON_STANDARD/SINGLE_THREADED/OLD_ARRAYS/ALT_KINDS/PERSIST/UNLIMITED_ERRORS/FIXED_FORMAT/SAVE/NO_WARN73/WIDE_SOURCE
slink64 @test_use.txt
use |
Commenting out "call SR2" shows in the .map that LO acts as LE for the library file in the build.
I hope this example is of use. |
|
Back to top |
|
|
DietmarSiepmann
Joined: 03 Jun 2013 Posts: 279
|
Posted: Thu Apr 12, 2018 4:09 pm Post subject: |
|
|
John,
I am not sure how to understand your lines
. To make clear what I meant in my sample with the lines
please look at file create_static_libraries.bat following:
Code: |
@echo off
setlocal
set MYCCOPTS=/FIXED_FORMAT/SAVE
if "%1" == "" (
set UPPERBOUND=5
) else (
set UPPERBOUND=%1
)
echo C Program generated > test_generated.for
echo SUBROUTINE SR1 >> test_generated.for
echo *(KSTEU) >> test_generated.for
for /L %%J in (1,1,%UPPERBOUND%) do (
echo INTEGER*2 MYI2_%%J >> test_generated.for
)
for /L %%J in (1,1,%UPPERBOUND%) do (
echo MYI2_%%J=1_2 >> test_generated.for
)
echo KSTEU=%UPPERBOUND% >> test_generated.for
echo return >> test_generated.for
echo end >> test_generated.for
if exist test_generated.obj del test_generated.obj
if exist test_generated.sl64 del test_generated.sl64
echo ftn95 test_generated /64 %MYCCOPTS%
ftn95 test_generated /64 %MYCCOPTS% > test_generated.log 2>&1
echo lo test_generated.obj > test_gen.txt
echo file test_generated.sl64 >> test_gen.txt
echo slink64 @test_gen.txt
slink64 @test_gen.txt
if ERRORLEVEL 1 (
echo Could not create archive test_generated.sl64
exit /B 1
)
echo C use_lib.for to use library test_generated.sl64 > use_lib.for
echo C >> use_lib.for
echo C Program generated >> use_lib.for
echo integer ksteu >> use_lib.for
echo character*1 c1 >> use_lib.for
echo call SR1 (ksteu) >> use_lib.for
echo write (*,*) 'The number is :',ksteu >> use_lib.for
echo write(*,*) 'Enter any key to exit' >> use_lib.for
echo read(1,'(A1)') c1 >> use_lib.for
echo end >> use_lib.for
echo ftn95 use_lib /64 %MYCCOPTS%
ftn95 use_lib /64 %MYCCOPTS%
echo lo use_lib.obj > test_use.txt
echo lo test_generated.sl64 >> test_use.txt
echo file use.exe >> test_use.txt
if exist use.exe del use.exe
echo slink64 test_use.txt
slink64 @test_use.txt
echo .\use.exe
.\use.exe
endlocal
|
If you execute this batch file, then the following files are created:
Code: |
test_generated.for
test_generated.obj
test_generated.log
test_gen.txt
test_generated.sl64
use_lib.for
use_lib.obj
test_use.txt
use.exe
|
and file use.exe is ececuted and lines
Code: |
The number is : 5
Enter any key to exit
|
are displayed. In order to verify which SALFORD DLLs have been loaded you may want to make use of the resource manager. It turns out that Dlls clearwin64.dll and salflib64.dll of ftn95 version 8.30 have been loaded as expected. You may exit programme use.exe by typing any key followed by the ENTER key.
Now you may call create_static_libraries.bat with an integer paramater (>5) to increase the number declarations an assignments in file test_generated.for (genarated by the batch file). In my environment, call
Code: |
create_static_libraries.bat 93
|
works ok and executable use.exe creates the line
. However, calling
Code: |
create_static_libraries.bat 94
|
does not work and does not create static library test_generated.sl64. |
|
Back to top |
|
|
DietmarSiepmann
Joined: 03 Jun 2013 Posts: 279
|
Posted: Thu Apr 12, 2018 4:59 pm Post subject: |
|
|
John,
I am sorry, but I accidently submitted the last post before proofreading. To be sure about the source you used could you please execute call
Code: |
create_static_libraries.bat 94 |
in a new directory and tell me if this works?
Moreover, I don't understand why you expandend the test with extra library test_gen2.lib. What do you mean with "that LO acts as LE for the library file"?
John and Paul,
I wonder if slink64 might have problems with the size of the object file generated. When calling batch create_static_libraries.bat with parameter 94, the size of object file test_generated.obj is 4.070 bytes. Have you been able to create static libraries from object files with sizes greater than 4.070 bytes?
Thanks in advance for any help.
Regards,
Dietmar |
|
Back to top |
|
|
PaulLaidler Site Admin
Joined: 21 Feb 2005 Posts: 7932 Location: Salford, UK
|
Posted: Thu Apr 12, 2018 8:12 pm Post subject: |
|
|
I now have enough information to see that there is a problem.
I have made a note that we need to investigate further. |
|
Back to top |
|
|
|