декорирование имён в gcc
От: ek_  
Дата: 06.03.08 12:15
Оценка:
Большущая просьба пособить с решением проблемы:
При сборке dll в gcc под виндой (3.4.2 mingw-special) в разделе экспорта в длл у функций имена пишутся без нижнего подчеркивания. А мне нужно, чтобы это нижнее подчеркивание было(длл потом подгружается из явы). -fleading-underscore не спасает ни в каком виде.
Например:
dll.h
#ifdef BUILD_DLL
/* DLL export */
#define EXPORT __declspec(dllexport)
#else
/* EXE import */
#define EXPORT __declspec(dllimport)
#endif
 extern "C" EXPORT  void hello(void);

dll.c
#include <stdio.h>
#include "dll.h"

EXPORT void hello(void) {
    printf ("Hello\n");
}

g++ -c -fleading-underscore dll.c -o dll.o
вот что пишет о dll.o nm:

00000000 b .bss
00000000 d .data
00000000 i .drectve
00000000 r .rdata
00000000 t .text
00000000 T _hello
         U _printf


замечательно, есть подчеркивание.
собираем:
g++ -shared dll.o -o dll.dll

говорим pexports dll.dll

LIBRARY dll.dll
EXPORTS
hello


вот такое вот безобразие. мне же надо, чтобы было
LIBRARY dll.dll
EXPORTS
_hello

В vc++ всё собирается как надо, но, чёрт побери, это не вариант.
Точно такое же поведение, если собирать gcc без extern "C". g++ без extern "C" подчеркивание оставляет, но при этом символ имеет примерно такой вид: _Z65hello, что тоже не вариант.
Re: декорирование имён в gcc
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 06.03.08 13:02
Оценка:
Здравствуйте, ek_, Вы писали:

ek_>Большущая просьба пособить с решением проблемы:

ek_>При сборке dll в gcc под виндой (3.4.2 mingw-special) в разделе экспорта в длл у функций имена пишутся без нижнего подчеркивания. А мне нужно, чтобы это нижнее подчеркивание было(длл потом подгружается из явы). -fleading-underscore не спасает ни в каком виде.

В function attributes есть такое:

`alias ("TARGET")'
The `alias' attribute causes the declaration to be emitted as an
alias for another symbol, which must be specified. For instance,

void __f () { /* Do something. */; }
void f () __attribute__ ((weak, alias ("__f")));

declares `f' to be a weak alias for `__f'. In C++, the mangled
name for the target must be used.

Not all target machines support this attribute.


не знаю, насколько это применимо к mingw, но попробовать можно.
The God is real, unless declared integer.
Re: декорирование имён в gcc
От: K13 http://akvis.com
Дата: 06.03.08 14:06
Оценка:
ek_>говорим pexports dll.dll

ek_>
ek_>LIBRARY dll.dll
ek_>EXPORTS
ek_>hello
ek_>


ek_>вот такое вот безобразие. мне же надо, чтобы было

ek_>
ek_>LIBRARY dll.dll
ek_>EXPORTS
ek_>_hello
ek_>

ek_>В vc++ всё собирается как надо, но, чёрт побери, это не вариант.

А mingw понимает .def ? Если да, то прописать там.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.