Fortran Common Linking please comment
Phil Wilshire
philwil@on-ramp.ior.com
Tue Aug 24 11:57:00 GMT 1999
Hi,
I have seen some discussions on this list about this problem.
PLease forgive me if it is out of context.
This is all running under Linux RH 5.2
I have reserved 2M of memory at boot time using lilo.
I can access this happily with a normal C program.
I now want to force a fortran common to occupy that space.
For now I can leave the fortran details out though.
I have defined a new section for the common with a little assembly
program
======================cm.s=======================================
[root@vmedev2 f2c]# more cm.s
.file "cm.s"
.version "01.01"
gcc2_compiled.:
.globl mycommon_
.section .xdata
.align 4
.type mycommon_,@object
.size mycommon_,100
mycommon_:
.long 133169152
.text
.ident "GCC: (GNU) 2.7.2.3"
==================end cm.s======================================
cc -c cm.s
Here is my main c program
=================c3.c==============================================
#include <stdio.h>
#include <stddef.h>
#include "sm.h"
extern int * mycommon_;
int main()
{
int i;
char * ip;
ip = alloc_shmem(127 * 0x100000,100);
printf(" ip address == %p\n",ip);
*ip = 21;
printf(" before *ip == %d\n",*ip);
sub_(&si1,&si2); /* call fortran routine to initialize array */
printf(" after *ip == %d\n",*ip);
/*
for(i=0;i<10;i++)
printf("%d ",mycommon_[i]);
printf("\n");
*/
return 0;
}
===================end c3.c=========================================
cc -c c3.c to compile
The shared memory allocation program
===================sm.h===========================
#ifndef __SM_H
#define __SM_H
int *alloc_shmem(int sm_base,int sm_size);
void free_shmem(int *ptr,int sm_size);
#endif
=================end sm.h==========================
sm.c looks like this
==========================sm.c========================================
/*
sm.c
from orig by Rob Butera
*/
#include <unistd.h> /* close */
#include <stdio.h>
#include <fcntl.h> /* open */
#include <sys/mman.h> /* mmap, munmap */
#include "sm.h"
int *alloc_shmem(int sm_base,int sm_size)
{
int *ptr ;
int memd ;
if ( (memd=open("/dev/mem", O_RDWR)) < 0 ) {
printf(" open failed \n");
return NULL ;
}
ptr = (int *) mmap((void *)sm_base, sm_size, PROT_READ | PROT_WRITE,
MAP_FILE | MAP_SHARED, memd, sm_base);
if (MAP_FAILED == ptr) {
printf(" map failed \n");
return NULL ;
}
close(memd) ;
return ptr ;
}
void free_shmem(int *ptr,int sm_size)
{
munmap((void *)ptr, sm_size) ;
}
=================end
sm.c======================================================
again cc -c sm.c
the fortran program look like
==================f.f============================================================
subroutine sub(i1,i2)
integer*2 i1
integer*2 i2
integer int_array(10)
common /mycommon/int_array
do i = 1,10
int_array(i) = i
end do
end
============end
f.f===============================================================
g77 -c f.f
Having got sm.o c3.o f.o and cm.o I link them all together and try to
define the mycommon_ symbol
ld -r -o foo.o --defsym mycommon_=0x7f00000 c3.o sm.o cm.o f.o
then I do
ld -o foo foo.o
to produce an executable.
./foo
address == 0x7f00000
before *ip == 21
after *ip == 1
This seems to work.
Any comments on how stable this is and I could do this any better.
Regards
Phil Wilshire
------
Want more information? See the CrossGCC FAQ, http://www.objsw.com/CrossGCC/
Want to unsubscribe? Send a note to crossgcc-unsubscribe@sourceware.cygnus.com
More information about the crossgcc
mailing list