delorie.com/archives/browse.cgi   search  
Mail Archives: djgpp/1994/01/27/02:44:13

From: root AT ilfb03 DOT tuwien DOT ac DOT at (Gerhard Schneider)
Subject: COFF, the linker and Fortran BLOCK DATA
To: djgpp AT sun DOT soe DOT clarkson DOT edu
Date: Wed, 19 Jan 1994 13:28:19 +0100 (MET)
Sender: root AT ilfb03 DOT tuwien DOT ac DOT at

With the change of djgpp from a.out to COFF we got problems with the
following code structure (the easiest sample code follows):

If you convert a fortran BLOCK DATA statement into C-Code (f2c) and put
the compiled code into a library the linker ignores it.

Sample:

---- makefile ----

all: 
	f2c -a -h -r test1.f
	f2c -a -h -r test2.f
	gcc -c test1.c
	gcc -c test2.c
	ar ruv libtest.a test2.o
	ranlib libtest.a
	gcc -o test1 test1.o test2.o -lf77 -li77 -lm
	gcc -o test2 test1.o -L. -ltest -lf77 -li77 -lm
	coff2exe test1
	coff2exe test2
	test1.exe
	test2.exe

---- test1.f ----

	PROGRAM TEST1
C
	COMMON /COMM1/ A
C
	PRINT *,A
C
	END

---- test2.f ----

	BLOCK DATA
C
	COMMON /COMM1/ A
C
	DATA A /1/
C
	END

---- test1.c ----
/* test1.f -- translated by f2c (version of 21 October 1993  13:46:10).
   You must link the resulting object file with the libraries:
	-lf77 -li77 -lm   (in that order)
*/

#include "f2c.h"

/* Common Block Declarations */

struct {
    real a;
} comm1_;

#define comm1_1 comm1_

/* Table of constant values */

static integer c__4 = 4;
static integer c__1 = 1;

/* Main program */ MAIN__()
{
    /* Builtin functions */
    integer s_wsle(), do_lio(), e_wsle();

    /* Fortran I/O blocks */
    static cilist io___1 = { 0, 6, 0, 0, 0 };

    s_wsle(&io___1);
    do_lio(&c__4, &c__1, (char *)&comm1_1.a, (ftnlen)sizeof(real));
    e_wsle();

} /* MAIN__ */

/* Main program alias */ int test1_ () { MAIN__ (); }
---- test2.c ----

/* test2.f -- translated by f2c (version of 21 October 1993  13:46:10).
   You must link the resulting object file with the libraries:
	-lf77 -li77 -lm   (in that order)
*/

#include "f2c.h"

/* Common Block Declarations */

struct comm1_1_ {
    real a;
};

#define comm1_1 (*(struct comm1_1_ *) &comm1_)

/* Initialized data */

struct {
    real e_1;
    } comm1_ = { (float)1. };

---- END ----

Thank you for your help

                                             Gerhard Schneider
-- 
Gerhard Schneider                                e-Mail: gs AT ilfb03 DOT tuwien DOT ac DOT at 
Institute of Light Weight Structures (E317)      Tel.:   +43 1 58801 3711     
Technical University of Vienna / Austria         Fax:    +43 1 505 44 68
A-1040 Wien, Gusshausstrasse 27-29                    


- Raw text -


  webmaster     delorie software   privacy  
  Copyright 2019   by DJ Delorie     Updated Jul 2019