Win32 DLLS - dllhelpers problem

Kai Ruottu
Fri Nov 29 05:35:00 GMT 2002

Paul Griffin <> write:

> The target architecture is actually an ARM7TDMI 
> I've seen on Unix based systems how shared libraries
> are created with the .so extension type but as i'm
> developing on a windows machine through a cygwin host
> i need to create dlls or more to the point libraries
> of the form  libfoo.dll.a
> This is essentially what dllhelpers tries to achieve
> and does so successfully on a i686-pc-cygwin version
> of gcc i have also built.

 Maybe I haven't understood the idea here... Should it
enable basically 'static' systems to use shared libs ?

> what i'm wondering is, is there some fundamental issue
> with the arm-elf target that prevents the creation of
> DLLs??? 

 The 'arm-elf' should be a system where all executables
are statically linked, ie. all the needed library functions
are linked into the executable and this executable put into
ROM with some kind of simple 'opsys'.

 Meanwhile the 'arm-linux', 'arm-epoc-pe', 'arm-wince-pe',
'arm-netbsd' and probably also the 'arm-uclinux' systems have
a mechanism where the library routines can be in 'shared' or
'dynamically linked' libraries which can be in ROM. And also
the operating system code itself can be in ROM. Maybe the
'application' programs then run from RAM or also it can be in
Flash or something... I haven't implemented these systems, but
here should be those who are...

 Anyway in their C-libraries should be routines which 'load'
the whole shared library / DLL into memory or arrange jump-
tables or something with which the application can use the
library routine. AFAIK 'newlib' doesn't provide anything for
this purpose...

> > > In file included from cdll.c:1: 
> > > cdll.h:25: warning: return type defaults to 'int' 
> > > cdll.h: In function '__declspec': 
> > > cdll.h:26: parse error before "__declspec" 

 If you build a toolchain for 'arm-pe' and the GCC-sources
support the '__declspec' with it, like with the 'arm-epoc-pe':

--------------------- clip -----------------------------------
-Acpu(arm) -Amachine(arm) -D__declspec(x)=__attribute__((x))
--------------------- clip -----------------------------------

The 'arm-elf' basically doesn't support this:

--------------------- clip -----------------------------------
-Darm -Darm_elf -Acpu(arm) -Amachine(arm) -D__ELF__
--------------------- clip -----------------------------------

 If you simply add the '-D__declspec(x)=__attribute__((x))' into
the predefines or use it on the command line, I don't know what
happens... Neither do I know what the attributes are which the
ARM-port should support...

 In your case the 'arm-pe' target could be the one where these
things are supported, a clip from 'gcc/config/arm/pe.h' could
claim this way:

--------------------- clip -----------------------------------
/* Run-time Target Specification.  */
#define TARGET_VERSION fputs (" (ARM/pe)", stderr)

/* Get tree.c to declare a target-specific specialization of
   merge_decl_attributes.  */

/* Support the __declspec keyword by turning them into attributes.
   We currently only support: naked, dllimport, and dllexport.
   Note that the current way we do this may result in a collision 
   predefined attributes later on.  This can be solved by using one 
   say __declspec__, and passing args to it.  The problem with that 
   is that args are not accumulated: each new appearance would 
clobber any
   existing args.  */
#define SUBTARGET_CPP_SPEC "-D__pe__ -

--------------------- clip -----------------------------------

 Support for the 'dllimport' and 'dllexport' attributes could
be what you want... And with the 'arm-pe' it exists while with
'arm-elf' it doesn't.

 Generally I'm just a novice in this 'arm-pe' issue and would
try to learn via the stuff in :

or something...

Cheers, Kai

Want more information?  See the CrossGCC FAQ,
Want to unsubscribe? Send a note to

More information about the crossgcc mailing list