[Kos-dev] [David Decotigny <David.Decotigny@irisa.fr>] Re: Probleme avec le C++

Thomas Petazzoni kos-dev@enix.org
25 Nov 2002 10:54:28 +0100


--=-=-=
Content-Type: text/plain; charset=iso-8859-1
Content-Transfer-Encoding: 8bit

Bonjour,

Voici la réponse de David a un mail envoyé hier concernant le probleme
du name mangling en C++.

En effet, notre nouveau module 'kares' compile (pas sur le CVS, sur
des petits essais a cote). Le C++ fonctionne, etc.. (on remercie
d'ailleurs Julien qui a fait tout le boulot).

Donc Julien a commencé hier à essayer de porter le module (et driver)
tty pour voir comment ca donnait avec le nouveau module 'kares',
plutot qu'avec l'ancien Babel. Et la : surprise ;)

relocate_section@link.c:70] **** System Halted **** :
Unresolved symbol "__11DriverClassPCcN21Ui" in module console.ro.

Il s'avere que des classes definies dans le module tty essaient
d'appeler des constructeurs des classes parents dans le module
kares. D'une part le constructeur est pas exporte, et d'autre part,
avec le name mangling C++ de folie, ca risque de pas etre simple.

Voici donc la repons de David, proposant deux solutions. Si des gens
sur cette mailing list ont d'autres idees. Pourquoi pas !

Thomas



--=-=-=
Content-Type: message/rfc822
Content-Disposition: inline

X-From-Line: David.Decotigny@irisa.fr  Mon Nov 25 10:48:24 2002
Return-Path: <David.Decotigny@irisa.fr>
Delivered-To: thomas@localhost.kos.nx
Received: from localhost (localhost [127.0.0.1])
	by crazy (Postfix) with ESMTP id 30E7B1A875
	for <thomas@localhost>; Mon, 25 Nov 2002 10:48:24 +0100 (CET)
Delivered-To: thomas@the-doors.enix.org
Received: from the-doors.enix.org [62.4.21.166]
	by localhost with IMAP (fetchmail-6.1.0)
	for thomas@localhost (single-drop); Mon, 25 Nov 2002 10:48:24 +0100 (CET)
Received: from sky.irisa.fr (sky.irisa.fr [131.254.60.147])
	by the-doors.enix.org (Postfix) with ESMTP id D4B2A10052
	for <thomas.petazzoni@enix.org>; Mon, 25 Nov 2002 10:37:35 +0100 (CET)
Received: from blutch.irisa.fr (blutch.irisa.fr [131.254.13.41])
	by sky.irisa.fr (8.11.4/8.11.4) with ESMTP id gAP9eA125293;
	Mon, 25 Nov 2002 10:40:10 +0100 (MET)
To: Thomas Petazzoni <thomas.petazzoni@enix.org>,
	Julien Munier <munier@wanadoo.fr>
Subject: Re: Probleme avec le C++
References: <87adjyjzwj.fsf@crazy.kos.nx>
X-Attribution: d2
X-Mailer: My GNUS is rich
Reply-To: David.Decotigny@irisa.fr
X-Loop: David.Decotigny@irisa.fr
In-Reply-To: <87adjyjzwj.fsf@crazy.kos.nx>
From: David Decotigny <David.Decotigny@irisa.fr>
Sender: David.Decotigny@irisa.fr
Original-Sender: David.Decotigny@irisa.fr
X-Subliminal: My GNUS is rich
X-Home-Page: http://david.decotigny.proxone.net
X-Portrait: http://www.irisa.fr/PHOTOS/html/ddecotig.html
X-VCard: http://david.decotigny.proxone.net/d2.vcf
Date: 25 Nov 2002 10:40:10 +0100
Message-ID: <wacptsuvvgl.fsf@blutch.irisa.fr>
User-Agent: Gnus/5.0808 (Gnus v5.8.8) Emacs/20.7
X-MailScanner: Found to be clean
Lines: 58
Xref: crazy.kos.nx david:495
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii


Hello,

>>>>> "Thomas" == Thomas Petazzoni <thomas.petazzoni@enix.org> writes:
    Thomas> relocate_section@link.c:70] **** System Halted **** :
    Thomas> Unresolved symbol "__11DriverClassPCcN21Ui" in module
    Thomas> console.ro.

Je vois je vois : comment recuperer un nom de symbole mangled ala C++ ?...

Pas simple. Je vois 2 solutions.

1ere solution, un script qui genere une correspondance nom mangle /
nom exporte a partir du .ro sous la forme d'un fichier du style :
  __11DriverClassPCcN21Ui # DriverClass::DriverClass(char const *, char const *, char const *, unsigned int)
  ...
Par exemple, pour la generation du fichier :
  nm le_module.ro | sed s'/^.* \([^ ]*\)$/echo "\1 # `echo \1 | c++filt`"/p;d' | sh > symbols.lst

Et la-dedans on supprime ou on commente (# en debut de ligne) les
methodes qui ne doivent pas etre exportees. Une fois que ca c'est
fait, on genere un fichier C (pas C++), qui contient les entrees du
type :
  extern void __11DriverClassPCcN21Ui();
  EXPORT_FUNCTION(__11DriverClassPCcN21Ui);

Par exemple, pour la generation du .c :
  sed '/^ *#/d;s/#.*$//;s/\([^ ]*\)/extern void \1(); EXPORT_FUNCTION(\1);/p;d' < symbols.lst > symbols.c

Si vous aimez pas sed, y'a aussi awk, c'est plus simple et plus
lisible. Ou perl.

2eme solution (peut-etre pour plus tard, ou maintenant si vous vous en
sentez le courage) : on rajoute __attribute__ ((section
(".export.text"))); apres les declaration de methodes a exporter dans
le .h (eventuellement sous la forme de macros), que ce soit en C ou en
C++, et voila qui est une autre facon d'exporter les symboles. Mais
dans ce cas il faut changer un peu le loader (pas beaucoup, mais il
faut quand meme le changer : la .kstrsymtab devient la string table de
.export.text, et la .kfunctab devient .export.text ; idem avec les
variables). Finalement, ca serait peut-etre bien de faire qqch comme
ca... En plus avec cette technique ce serait mecaniquement impossible
d'exporter qqch qui est dans les sections .init/.ctor/.dtor.

Par exemple :
class A {
public:
  A() { i=42; }
  int geti() const __attribute__ ((section (".export.text")));
protected:
  int i;
};

Bon courage,

-- 
David Decotigny


--=-=-=



-- 
PETAZZONI Thomas - thomas.petazzoni@enix.org - UIN : 34937744
(Perso)      http://www.enix.org/~thomas/
(KOS)        http://kos.enix.org/ 
(Club LinUT) http://club-linut.enix.org

--=-=-=--