Account Options

  1. Sign in
The old Google Groups will be going away soon, but your browser is incompatible with the new version.
Google Groups Home
« Groups Home
Message from discussion Name mangling, RTTI y compatibilidad entre compiladores

Received: by 10.52.21.68 with SMTP id t4mr3267882vde.8.1333135236608;
        Fri, 30 Mar 2012 12:20:36 -0700 (PDT)
X-BeenThere: cppba@googlegroups.com
Received: by 10.220.240.204 with SMTP id lb12ls1539680vcb.0.gmail; Fri, 30 Mar
 2012 12:20:36 -0700 (PDT)
Received: by 10.52.71.195 with SMTP id x3mr2904843vdu.4.1333135236257;
        Fri, 30 Mar 2012 12:20:36 -0700 (PDT)
Received: by 10.52.71.195 with SMTP id x3mr2904841vdu.4.1333135236227;
        Fri, 30 Mar 2012 12:20:36 -0700 (PDT)
Return-Path: <danielgut...@gmail.com>
Received: from mail-vb0-f41.google.com (mail-vb0-f41.google.com [209.85.212.41])
        by gmr-mx.google.com with ESMTPS id hc9si4571228vdb.2.2012.03.30.12.20.36
        (version=TLSv1/SSLv3 cipher=OTHER);
        Fri, 30 Mar 2012 12:20:36 -0700 (PDT)
Received-SPF: pass (google.com: domain of danielgut...@gmail.com designates 209.85.212.41 as permitted sender) client-ip=209.85.212.41;
Authentication-Results: gmr-mx.google.com; spf=pass (google.com: domain of danielgut...@gmail.com designates 209.85.212.41 as permitted sender) smtp.mail=danielgut...@gmail.com; dkim=pass header...@gmail.com
Received: by vbbey12 with SMTP id ey12so657010vbb.28
        for <cppba@googlegroups.com>; Fri, 30 Mar 2012 12:20:36 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
        d=gmail.com; s=20120113;
        h=mime-version:in-reply-to:references:date:message-id:subject:from:to
         :content-type;
        bh=RLS6H3Fle4obqEifZWKYj1aiADCciVzPU056aRchsq8=;
        b=m/enIFfrxiv110apoX0h7RHwKpo0ZfOILTJ6KtvZunqXzqQkoYdec4LgKTsWFQ9BCG
         PbamXGA+Is09MuIFQlAiIIk1tgU6FfnEdyjRWe2USw/ZgsjLqrvjx656dirBfBdQJ67Y
         OYodO1rZm86VwPMF8QUfrP7AjKbQf4TY2ARA6y5XjLTdt1JT5Ssws9hPBkrEuNDNbHZa
         0y1m/QYfRO3374UtE1TPSqpVI4jVkVd5ogWRBErOhKd3UAq2381WIobYR2Pd4ANcp9As
         ZuvKPb00tMRVsGoIRBxezOnMrbQWKMCXEiMZ2NWL4gTH51/J8K5kmYY1DtlSSvgQKBKN
         Pk7Q==
MIME-Version: 1.0
Received: by 10.52.67.199 with SMTP id p7mr1258508vdt.75.1333135236100; Fri,
 30 Mar 2012 12:20:36 -0700 (PDT)
Received: by 10.52.117.66 with HTTP; Fri, 30 Mar 2012 12:20:36 -0700 (PDT)
In-Reply-To: <CAFdMc-2Zid-rZTUr8dMCL3WRDM_Y9KnBMxpyPEOcdOFsT1=...@mail.gmail.com>
References: <CAC3KrV_-Q035meEpt5pd7bv-0+Z5soeAnuRXm8pxsA44+Ad...@mail.gmail.com>
	<CAFdMc-2w-wv=viSDVd4j6dKWkh2UUGyzBy-SNOc1_qAsfiG...@mail.gmail.com>
	<CAC3KrV_uQ+vNGNj_8Y2UAYF6+700ec7KVLZhvNszO+7Kz80...@mail.gmail.com>
	<CAFdMc-18TN4Di+SrtO1LG4gH9-yTBSHH4QBQpv76epHPY7X...@mail.gmail.com>
	<CAFdMc-2Zid-rZTUr8dMCL3WRDM_Y9KnBMxpyPEOcdOFsT1=...@mail.gmail.com>
Date: Fri, 30 Mar 2012 16:20:36 -0300
Message-ID: <CAFdMc-33874w9QwJbDrdHW3TjDkhLhGUwXu7WhmSgb61acm...@mail.gmail.com>
Subject: Re: [cppba] Name mangling, RTTI y compatibilidad entre compiladores
From: Daniel Gutson <danielgut...@gmail.com>
To: cppba@googlegroups.com
Content-Type: multipart/alternative; boundary=20cf307abcdd2f719304bc7abc34

--20cf307abcdd2f719304bc7abc34
Content-Type: text/plain; charset=windows-1252
Content-Transfer-Encoding: quoted-printable

y una =FAltima aclaraci=F3n, alineada con separar compilador de linker.

si a.c lo compilaste con gcc X.Y, mientras que b.c lo compilaste con gcc
A.B, no interesa, lo interesa es que el linker que uses entienda lo que
escupen esas dos versiones del compilador.
Los compiladores no se hablan entre ellos(*), le hablan a los linkers.

(*) esto ya no es exactamente as=ED por LTO, pero eso es un thread aparte.


2012/3/30 Daniel Gutson <danielgut...@gmail.com>

> Quiero ir m=E1s alla de la cuesti=F3n t=E9cnica con esto.
> Compatibilidad binaria es algo anacr=F3nico hoy en d=EDa.
> Por qu=E9? Porque por un lado est=E1 el tema de free software (o
> indirectamente open source), y por otro el de performance.
> Este es exactamente el costo de tener una distribuci=F3n basada en binari=
os
> (como la mayor=EDa), en vez de una tipo gentoo que usa portage (te baja l=
os
> fuentes y los compila en tu m=E1quina con las opciones m=E1s adecuadas a =
la pc
> que ten=E9s para aprovechar el hardware al m=E1ximo).
>
> Por ejemplo, hay sutilezas a=FAn dentro de los micros de intel que pueden
> hacer que algo, por forzar a que sea m=E1s general, ande mucho m=E1s lent=
o y se
> desperdicien features interesantes.
>
>
> 2012/3/30 Daniel Gutson <danielgut...@gmail.com>
>
>>
>>
>> 2012/3/30 Joaquin Duo <joa...@gmail.com>
>>
>>> On Fri, Mar 30, 2012 at 12:45 AM, Daniel Gutson <danielgut...@gmail.com=
>wrote:
>>>
>>>> Joaqu=EDn,
>>>>
>>>>   te suger=ED que miraras unplugged.googlecode.com, lo viste? Viste lo=
s
>>>> ejemplos?
>>>>
>>> S=ED, lo v=ED. Deber=EDa probarlo con m=E1s profundidad.
>>> Ya tengo una versi=F3n funcional del sistema de plugins.
>>> Sin embargo est=E1 pensado con interfaces en C, para que tambi=E9n se p=
uedan
>>> escribir plugins en C.
>>>
>>
>> por qu=E9 es algo distinto a lo que propone dlfcn.h ?
>>
>>
>>> La idea es luego hacer una clase en C++ Wrapper  de las funciones de
>>> comunicaci=F3n con el n=FAcleo de la aplicaci=F3n.
>>> As=ED los plugins en C++ tendr=E1n una interface m=E1s c=F3moda.
>>>
>>
>> (insisto en que deber=EDas ver plugin.h :) )
>>
>>
>>> Cuando aborde esta etapa seguramente los consulte.
>>>
>>>
>>>> Vamos por partes porque hay mucho para responder.
>>>>
>>>> Vos, primero, sab=E9s que el problema no es tanto el compilador, sino =
el
>>>> DYNAMIC LOADER del sistema operativo?
>>>>
>>> S=ED. :-)
>>>
>>> El binding entre la aplicaci=F3n y un shared object ocurre din=E1micame=
nte
>>>> por la acci=F3n del DYNAMIC LOADER, que es un componente del sistema
>>>> operativo.
>>>>
>>>> El compilador ("casi" sin linker, puedo explicar en m=E1s detalle), es
>>>> amigo del sistema operativo target, ya que respeta lo que se llama ABI
>>>> (Application Binary Interface), un documento que escriben de la manito=
 el
>>>> fabricante del sistema operativo y el fabricante del microprocesador.
>>>>
>>>> NO HAY NAME MANGLING al menos en linux (no s=E9 en windows), es todo
>>>> C-calling conventions.
>>>>
>>> No comprendo a qu=E9 te refer=EDs.
>>>
>>
>> S=ED fui poco claro: que no hay name mangling en el soporte a dynamic
>> loading, porque es todo C-calling types. Y porque es una librer=EDa de C=
.
>>
>>
>>> En el siguiente email mencion=E1s que
>>> "  la raz=F3n de la existencia del name mangling, es hist=F3rica:"
>>>  S=E9 que la tabla de s=EDmbolos solo acepta cierto tipo de formato de
>>> nombre.
>>>
>>
>> tabla de s=EDmbolos? de qui=E9n? del compilador? No, en ese caso la tabl=
a de
>> s=EDmbolos del compilador no tiene nada que ver. La tabla de s=EDmbolos =
del
>> compilador vive temporalmente mientras compila, y se usa para hacer look=
up
>> de s=EDmbolos justamente. El name mangling aparece mucho despu=E9s, al m=
omento
>> de escribir esos s=EDmbolos en el archivo objeto para que el linker no s=
e
>> ofenda. Te aconsejo jugar con c++filt.
>>
>>
>>> Como explicas en el siguiente correo.
>>>
>>> Y por =FAltimo, si el plugin genera una instancia de una clase escrita =
en
>>>> un .h, que la aplicaci=F3n usar=E1, ni siquiera hace falta que cambies=
 de
>>>> compilador para tener kilombo: basta con que hayas compilado con disti=
ntas
>>>> opciones de empaquetamiento para que se rompa todo.
>>>>
>>>
>>>> Ahora bien, fij=E1te el link y despu=E9s cont=E1me para qu=E9 quer=E9s=
 hacer esto.
>>>> Ni C ni C++ tienen inter=E9s desde dise=F1o en ser binary-compatible c=
odes,
>>>> para eso est=E1 Java y .net.
>>>>
>>> Saquemos del contexto a los plugins. Ahora mi inter=E9s es meramente
>>> te=F3rico.
>>> Quisiera saber cu=E1ndo se rompen las compatibilidades y cu=E1ndo no.
>>>
>>> Dentro de un mismo compilador:
>>>
>>
>> xfa distingamos compilador de linker, porque en esta discusi=F3n es muy
>> relevante. Yo te puedo romper compatibilidad binaria s=F3lo entre
>> compiladores, sin meter al linker en el medio. Te muestro debajo c=F3mo.
>> Y decir "gcc" no es suficiente, porque gcc es el "compiler driver", es
>> decir, el programa titiritero que invoca a los distintos componentes del
>> toolchain: preprocesador, compilador, ensamblador, y eventualmente linke=
r.
>>
>>
>>> Por ejemplo. Si yo tengo las librer=EDas QT y las compilo con gcc-A.B,
>>> donde A y B son numeros
>>> Dandome como resultado un .a o .so (no deber=EDa haber diferencia como
>>> dec=EDs)
>>> Si compilo mi aplicaci=F3n linkeando contra la librer=EDa: (suponiendo =
que
>>> utilizo las mismas opciones de empaquetamiento)
>>> 1- con gcc-A.B (tiene que andar)
>>>
>>
>> No necesariamente, por estas dos razones:
>>   1) uses distintos par=E1metros de compilaci=F3n (ahora muestro)
>>   2) linkees contra distintas versiones de librer=EDas. Conoc=E9s ldd?
>> busc=E1lo y prob=E1lo.
>>
>>
>>
>>> 2- con gcc-A.(B+1) (andar=EDa?)
>>> 3- con gcc-(A+1).(B+x) (ya es seguro que se rompe?)
>>>
>>
>> Como te comento arriba, a=FAn dentro de una misma versi=F3n no est=E1
>> garantizada la compatibilidad.
>>
>> Se me ocurren al menos tres factores fundamentales que pueden romper
>> compatibilidad binaria usando el mismo compilador.
>>
>>   a) empaquetamiento de datos
>>   b) cant bits
>>   c) multilibs
>>
>>
>> a) empaquetamiento
>>
>> consider=E1
>>
>> struct Pepe
>> {
>>    char a;
>>    int b;
>> };
>>
>> en qu=E9 posici=F3n empieza b? (es decir, cu=E1nto vale offsetof(Pepe, b=
) ?)
>>
>> b) cant de bits: compilaste el coso para 32bits y el plugin para 64 o
>> viceversa. Hay otras plataformas (ej ARM) en que hay tanta combinaci=F3n=
 de
>> flags que controlan la generaci=F3n del binario, no s=F3lo cant. de bits=
.. por
>> ejemplo sin ir m=E1s lejos, endianness. Pod=E9s tener el core compilado =
como
>> big endian y el plugin como little endian. Pregunt=E1le a la nasa c=F3mo=
 le fue
>> por algo as=ED :)
>>
>> c) multilibs (esto es bastante gcc)
>> El concepto de "multilib" es que la instalaci=F3n de gcc viene equipada =
con
>> las librer=EDas buildeadas en varios sabores, de manera que seg=FAn el t=
arget y
>> las opciones que especifiques a gcc (no s=F3lo cant. de bits, sino tipo =
de
>> FPU, etc., cosas relevantes en otras plataformas), elegir=E1 aquella que=
 m=E1s
>> se parece o mejor se ajusta. Por ejemplo, en x86, las dos que est=E1n co=
mo
>> m=EDnimo son la multilib de 32 y la de 64 bits.
>> Entonces, el compiler driver elegir=E1 la multilib adecuada dependiendo =
de
>> 1) qu=E9 ofrece la instalaci=F3n, y 2) las opciones que se le pasan.
>>
>> prob=E1 poniendo
>>    gcc -print-multi-lib
>> para ver qu=E9 multilibs ten=E9s disponibles. Si ten=E9s una m=E1quina c=
om=FAn y
>> corriente, con una instalci=F3n de linux com=FAn y corriente (ej ubuntu)=
,
>> seguramente tengas la "default" (32 bits) y la de 64bits ( -m64 )
>>
>>
>>>
>>> En diferentes compiladores:
>>> Por otro lado mencion=E1s que ni siquiera C es binary-compatible.
>>> Esto se traduce a que no existen en el mundo sistemas que utilicen
>>> librer=EDas compiladas con diferentes compiladores?
>>>
>>
>> Fij=E1te el kilombo que tiene q hacer una distribuci=F3n de linux para p=
oder
>> enviarte un binario y que te ande. Eso lo pueden hacer porque ellos
>> controlan qu=E9 ten=E9s instalado. Y a veces as=ED ni anda.
>> En windows es "aparentemente" m=E1s f=E1cil, en que copi=E1s una dll y s=
al=EDs a
>> festejar diciendo eureka eureka con la felicidad del ignorante...
>>
>>
>>
>>>  O hay ciertos l=EDmites dentro de los cuales se puede llamar otras
>>> funciones y pasarles par=E1metros? (y que par=E1metros y resultados sea=
n tipos
>>> est=E1ndares o que sigan alguna regla)
>>>
>>
>> Calling conventions. Le=E9 todo lo de arriba y despu=E9s seguimos. Fij=
=E1te lo
>> del empaquetamiento.
>> A todo esto: por qu=E9 quer=E9s a tanta costa forzar algo para lo que no=
 fue
>> pensado y para lo que no es natural? (compatibilidad binaria en C)
>>
>>
>>
>>>
>>> Gracias por las respuestas!
>>> Espero que te mejores de la angina.
>>>
>>>
>>>>
>>>> 2012/3/30 Joaquin Duo <joa...@gmail.com>
>>>>
>>>>> Hola Lista!
>>>>> Gracias por sus respuestas!
>>>>>
>>>>> Dise=F1ando el sistema de plugins me han surgido ciertas dudas.
>>>>> Mi idea en el dise=F1o es que los plugins se puedan compilar con
>>>>> diferentes compiladores, y que la compatibilidad con el sistema tenga=
 larga
>>>>> duraci=F3n.
>>>>> En otras palabras, que no haga falta compilar nuevamente el plugin si
>>>>> cambia el compilador.
>>>>> Aunque no es un requisito fundamental me interesa saber c=F3mo se
>>>>> comportan las compatibilidades entre compiladores.
>>>>>
>>>>> 1- Respecto al name mangling:
>>>>> Tengo entendido que el name mangling cambia de un compilador a otro.
>>>>> Pero tambi=E9n de una versi=F3n a otra, no?
>>>>> No existe ahora un est=E1ndar que diga c=F3mo deber=EDa ser el name m=
angling?
>>>>> S=ED o s=ED tengo que compilar los plugins con la misma versi=F3n (o
>>>>> versiones cercanas) del compilador?
>>>>> Cu=E1les son los l=EDmites?
>>>>>
>>>>> Suponiendo que evito el problema usando una funci=F3n de interface
>>>>> 'extern "C"'.
>>>>> Qu=E9 compatibilidad hay a nivel l=F3gico/de compilaci=F3n entre
>>>>> compiladores?
>>>>>
>>>>> Suponiendo los siguientes pasos:
>>>>> 1- ambos compiladores leen la misma definici=F3n de una clase.
>>>>> 2- el n=FAcleo de la aplicaci=F3n es compilado con un compilador A, q=
ue
>>>>> usa esa clase
>>>>> 3- el plugin es compilado con el compilador B, que usa la clase.
>>>>> 4- el n=FAcleo carga la librer=EDa y recibe, luego de llamar una func=
i=F3n
>>>>> de la librer=EDa, un puntero a la clase creada por B.
>>>>> Pueden haber incompatibilidades?
>>>>>
>>>>> 2- Respecto a RTTI:
>>>>> Tengo las mismas dudas que para las compatibilidades entre clases.
>>>>> Qu=E9 sucede con el RTTI en diferentes compiladores? Hay
>>>>> incompatibilidades?
>>>>>
>>>>> Espero que la pregunta sea interesante.
>>>>> Gracias desde ya!
>>>>>
>>>>>  --
>>> =BFEres miembro de "CyC++ Buenos Aires" verdad? Si no lo eres, has
>>> recibido este mesaje por error.
>>> En caso de duda visita "http://groups.google.com/group/cppba"
>>>
>>
>>
>>
>> --
>> Who=92s got the sweetest disposition?
>> One guess, that=92s who?
>> Who=92d never, ever start an argument?
>> Who never shows a bit of temperament?
>> Who's never wrong but always right?
>> Who'd never dream of starting a fight?
>> Who get stuck with all the bad luck?
>>
>
>
>
> --
> Who=92s got the sweetest disposition?
> One guess, that=92s who?
> Who=92d never, ever start an argument?
> Who never shows a bit of temperament?
> Who's never wrong but always right?
> Who'd never dream of starting a fight?
> Who get stuck with all the bad luck?
>



--=20
Who=92s got the sweetest disposition?
One guess, that=92s who?
Who=92d never, ever start an argument?
Who never shows a bit of temperament?
Who's never wrong but always right?
Who'd never dream of starting a fight?
Who get stuck with all the bad luck?

--20cf307abcdd2f719304bc7abc34
Content-Type: text/html; charset=windows-1252
Content-Transfer-Encoding: quoted-printable

y una =FAltima aclaraci=F3n, alineada con separar compilador de linker.<div=
><br></div><div>si a.c lo compilaste con gcc X.Y, mientras que b.c lo compi=
laste con gcc A.B, no interesa, lo interesa es que el linker que uses entie=
nda lo que escupen esas dos versiones del compilador.</div>
<div>Los compiladores no se hablan entre ellos(*), le hablan a los linkers.=
</div><div><br></div><div>(*) esto ya no es exactamente as=ED por LTO, pero=
 eso es un thread aparte.</div><div><br><br><div class=3D"gmail_quote">2012=
/3/30 Daniel Gutson <span dir=3D"ltr">&lt;<a href=3D"mailto:danielgutson@gm=
ail.com">danielgut...@gmail.com</a>&gt;</span><br>
<blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1p=
x #ccc solid;padding-left:1ex">Quiero ir m=E1s alla de la cuesti=F3n t=E9cn=
ica con esto.<div>Compatibilidad binaria es algo anacr=F3nico hoy en d=EDa.=
</div><div>
Por qu=E9? Porque por un lado est=E1 el tema de free software (o indirectam=
ente open source), y por otro el de performance.</div>
<div>Este es exactamente el costo de tener una distribuci=F3n basada en bin=
arios (como la mayor=EDa), en vez de una tipo gentoo que usa portage (te ba=
ja los fuentes y los compila en tu m=E1quina con las opciones m=E1s adecuad=
as a la pc que ten=E9s para aprovechar el hardware al m=E1ximo).</div>

<div><br></div><div>Por ejemplo, hay sutilezas a=FAn dentro de los micros d=
e intel que pueden hacer que algo, por forzar a que sea m=E1s general, ande=
 mucho m=E1s lento y se desperdicien features interesantes.<div><div></div>=
<div class=3D"h5">
<br><br><div class=3D"gmail_quote">
2012/3/30 Daniel Gutson <span dir=3D"ltr">&lt;<a href=3D"mailto:danielgutso=
n...@gmail.com" target=3D"_blank">danielgut...@gmail.com</a>&gt;</span><br><bl=
ockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #=
ccc solid;padding-left:1ex">

<br><br><div class=3D"gmail_quote"><div>2012/3/30 Joaquin Duo <span dir=3D"=
ltr">&lt;<a href=3D"mailto:joa...@gmail.com" target=3D"_blank">joaduo@gmail=
.com</a>&gt;</span><br><blockquote class=3D"gmail_quote" style=3D"margin:0 =
0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">


<div class=3D"gmail_quote"><div>On Fri, Mar 30, 2012 at 12:45 AM, Daniel Gu=
tson <span dir=3D"ltr">&lt;<a href=3D"mailto:danielgut...@gmail.com" target=
=3D"_blank">danielgut...@gmail.com</a>&gt;</span> wrote:<br><blockquote cla=
ss=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;pa=
dding-left:1ex">



Joaqu=EDn,<div><br></div><div>=A0 te suger=ED que miraras <a href=3D"http:/=
/unplugged.googlecode.com" target=3D"_blank">unplugged.googlecode.com</a>, =
lo viste? Viste los ejemplos?</div></blockquote></div><div>S=ED, lo v=ED. D=
eber=EDa probarlo con m=E1s profundidad.<br>



Ya tengo una versi=F3n funcional del sistema de plugins.<br>Sin embargo est=
=E1 pensado con interfaces en C, para que tambi=E9n se puedan escribir plug=
ins en C.<br></div></div></blockquote><div><br></div></div><div>por qu=E9 e=
s algo distinto a lo que propone dlfcn.h ?</div>

<div>
<div>=A0</div><blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;=
border-left:1px #ccc solid;padding-left:1ex"><div class=3D"gmail_quote"><di=
v>La idea es luego hacer una clase en C++ Wrapper=A0 de las funciones de co=
municaci=F3n con el n=FAcleo de la aplicaci=F3n.<br>



As=ED los plugins en C++ tendr=E1n una interface m=E1s c=F3moda.<br></div><=
/div></blockquote><div><br></div></div><div>(insisto en que deber=EDas ver =
plugin.h :) )</div><div><div>=A0</div><blockquote class=3D"gmail_quote" sty=
le=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">


<div class=3D"gmail_quote"><div>Cuando aborde esta etapa seguramente los co=
nsulte.<br>=A0</div><div><blockquote class=3D"gmail_quote" style=3D"margin:=
0pt 0pt 0pt 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">

<div>Vamos por partes porque hay mucho para responder.</div>
<div><br></div><div>Vos, primero, sab=E9s que el problema no es tanto el co=
mpilador, sino el DYNAMIC LOADER del sistema operativo?</div></blockquote><=
/div><div>S=ED. :-)<br><br></div><div><blockquote class=3D"gmail_quote" sty=
le=3D"margin:0pt 0pt 0pt 0.8ex;border-left:1px solid rgb(204,204,204);paddi=
ng-left:1ex">



<div>El binding entre la aplicaci=F3n y un shared object ocurre din=E1micam=
ente por la acci=F3n del DYNAMIC LOADER, que es un componente del sistema o=
perativo.</div>
<div><br></div><div>El compilador (&quot;casi&quot; sin linker, puedo expli=
car en m=E1s detalle), es amigo del sistema operativo target, ya que respet=
a lo que se llama ABI (Application Binary Interface), un documento que escr=
iben de la manito el fabricante del sistema operativo y el fabricante del m=
icroprocesador.</div>




<div><br></div><div>NO HAY NAME MANGLING al menos en linux (no s=E9 en wind=
ows), es todo C-calling conventions.</div></blockquote></div><div>No compre=
ndo a qu=E9 te refer=EDs.</div></div></blockquote><div><br></div></div><div=
>

S=ED fui poco claro: que no hay name mangling en el soporte a dynamic loadi=
ng, porque es todo C-calling types. Y porque es una librer=EDa de C.</div><=
div>
<div>=A0</div><blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;=
border-left:1px #ccc solid;padding-left:1ex"><div class=3D"gmail_quote"><di=
v> En el siguiente email mencion=E1s que <br><div>&quot;=A0 la raz=F3n de l=
a existencia del name mangling, es hist=F3rica:&quot;<br>


</div>
S=E9 que la tabla de s=EDmbolos solo acepta cierto tipo de formato de nombr=
e. </div></div></blockquote><div><br></div></div><div>tabla de s=EDmbolos? =
de qui=E9n? del compilador? No, en ese caso la tabla de s=EDmbolos del comp=
ilador no tiene nada que ver. La tabla de s=EDmbolos del compilador vive te=
mporalmente mientras compila, y se usa para hacer lookup de s=EDmbolos just=
amente. El name mangling aparece mucho despu=E9s, al momento de escribir es=
os s=EDmbolos en el archivo objeto para que el linker no se ofenda. Te acon=
sejo jugar con c++filt.</div>

<div>
<div>=A0</div><blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;=
border-left:1px #ccc solid;padding-left:1ex"><div class=3D"gmail_quote"><di=
v>Como explicas en el siguiente correo.<br> <br></div><div><blockquote clas=
s=3D"gmail_quote" style=3D"margin:0pt 0pt 0pt 0.8ex;border-left:1px solid r=
gb(204,204,204);padding-left:1ex">



<div>Y por =FAltimo, si el plugin genera una instancia de una clase escrita=
 en un .h, que la aplicaci=F3n usar=E1, ni siquiera hace falta que cambies =
de compilador para tener kilombo: basta con que hayas compilado con distint=
as opciones de empaquetamiento para que se rompa todo.<br>



</div></blockquote><blockquote class=3D"gmail_quote" style=3D"margin:0pt 0p=
t 0pt 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div><br></div><div>Ahora bien, fij=E1te el link y despu=E9s cont=E1me para=
 qu=E9 quer=E9s hacer esto.</div><div>Ni C ni C++ tienen inter=E9s desde di=
se=F1o en ser binary-compatible codes, para eso est=E1 Java y .net.<br></di=
v></blockquote>



</div><div>Saquemos del contexto a los plugins. Ahora mi inter=E9s es meram=
ente te=F3rico.<br>Quisiera saber cu=E1ndo se rompen las compatibilidades y=
 cu=E1ndo no.<br><br>Dentro de un mismo compilador:<br></div></div></blockq=
uote>


<div><br></div></div><div>xfa distingamos compilador de linker, porque en e=
sta discusi=F3n es muy relevante. Yo te puedo romper compatibilidad binaria=
 s=F3lo entre compiladores, sin meter al linker en el medio. Te muestro deb=
ajo c=F3mo.</div>


<div>Y decir &quot;gcc&quot; no es suficiente, porque gcc es el &quot;compi=
ler driver&quot;, es decir, el programa titiritero que invoca a los distint=
os componentes del toolchain: preprocesador, compilador, ensamblador, y eve=
ntualmente linker.</div>

<div>
<div>=A0</div><blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;=
border-left:1px #ccc solid;padding-left:1ex"><div class=3D"gmail_quote"><di=
v>Por ejemplo. Si yo tengo las librer=EDas QT y las compilo con gcc-A.B, do=
nde A y B son numeros<br>



Dandome como resultado un .a o .so (no deber=EDa haber diferencia como dec=
=EDs)<br>Si compilo mi aplicaci=F3n linkeando contra la librer=EDa: (suponi=
endo que utilizo las mismas opciones de empaquetamiento)<br>1- con gcc-A.B =
(tiene que andar)<br>


</div></div></blockquote><div><br></div></div><div>No necesariamente, por e=
stas dos razones:</div><div>=A0 1) uses distintos par=E1metros de compilaci=
=F3n (ahora muestro)</div><div>=A0 2) linkees contra distintas versiones de=
 librer=EDas. Conoc=E9s ldd? busc=E1lo y prob=E1lo.</div>

<div>
<div><br></div><div>=A0</div><blockquote class=3D"gmail_quote" style=3D"mar=
gin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class=3D"g=
mail_quote"><div>
2- con gcc-A.(B+1) (andar=EDa?)<br>3- con gcc-(A+1).(B+x) (ya es seguro que=
 se rompe?)<br></div></div></blockquote><div><br></div></div><div>Como te c=
omento arriba, a=FAn dentro de una misma versi=F3n no est=E1 garantizada la=
 compatibilidad.</div>


<div><br></div><div>Se me ocurren al menos tres factores fundamentales que =
pueden romper compatibilidad binaria usando el mismo compilador.</div><div>=
<br></div><div>=A0 a) empaquetamiento de datos</div><div>=A0 b) cant bits</=
div>


<div>=A0 c) multilibs</div><div><br></div><div><br></div><div>a) empaquetam=
iento</div><div><br></div><div>consider=E1</div><div><br></div><div>struct =
Pepe</div><div>{</div><div>=A0 =A0char a;</div><div>=A0 =A0int b;</div><div=
>};</div>


<div><br></div><div>en qu=E9 posici=F3n empieza b? (es decir, cu=E1nto vale=
 offsetof(Pepe, b) ?)</div><div><br></div><div>b) cant de bits: compilaste =
el coso para 32bits y el plugin para 64 o viceversa. Hay otras plataformas =
(ej ARM) en que hay tanta combinaci=F3n de flags que controlan la generaci=
=F3n del binario, no s=F3lo cant. de bits.. por ejemplo sin ir m=E1s lejos,=
 endianness. Pod=E9s tener el core compilado como big endian y el plugin co=
mo little endian. Pregunt=E1le a la nasa c=F3mo le fue por algo as=ED :)</d=
iv>


<div><br></div><div>c) multilibs (esto es bastante gcc)</div><div>El concep=
to de &quot;multilib&quot; es que la instalaci=F3n de gcc viene equipada co=
n las librer=EDas buildeadas en varios sabores, de manera que seg=FAn el ta=
rget y las opciones que especifiques a gcc (no s=F3lo cant. de bits, sino t=
ipo de FPU, etc., cosas relevantes en otras plataformas), elegir=E1 aquella=
 que m=E1s se parece o mejor se ajusta. Por ejemplo, en x86, las dos que es=
t=E1n como m=EDnimo son la multilib de 32 y la de 64 bits.</div>


<div>Entonces, el compiler driver elegir=E1 la multilib adecuada dependiend=
o de 1) qu=E9 ofrece la instalaci=F3n, y 2) las opciones que se le pasan.</=
div><div><br></div><div>prob=E1 poniendo</div><div>=A0 =A0gcc -print-multi-=
lib</div>


<div>para ver qu=E9 multilibs ten=E9s disponibles. Si ten=E9s una m=E1quina=
 com=FAn y corriente, con una instalci=F3n de linux com=FAn y corriente (ej=
 ubuntu), seguramente tengas la &quot;default&quot; (32 bits) y la de 64bit=
s ( -m64 )</div>

<div>
<div>=A0</div><blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;=
border-left:1px #ccc solid;padding-left:1ex"><div class=3D"gmail_quote"><di=
v><br>En diferentes compiladores:<br>Por otro lado mencion=E1s que ni siqui=
era C es binary-compatible.<br>


Esto se traduce a que no existen en el mundo sistemas que utilicen librer=
=EDas compiladas con diferentes compiladores?<br></div></div></blockquote><=
div><br></div></div><div>Fij=E1te el kilombo que tiene q hacer una distribu=
ci=F3n de linux para poder enviarte un binario y que te ande. Eso lo pueden=
 hacer porque ellos controlan qu=E9 ten=E9s instalado. Y a veces as=ED ni a=
nda.</div>


<div>En windows es &quot;aparentemente&quot; m=E1s f=E1cil, en que copi=E1s=
 una dll y sal=EDs a festejar diciendo eureka eureka con la felicidad del i=
gnorante...</div><div><div><br></div><div>=A0</div><blockquote class=3D"gma=
il_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-lef=
t:1ex">


<div class=3D"gmail_quote"><div>
O hay ciertos l=EDmites dentro de los cuales se puede llamar otras funcione=
s y pasarles par=E1metros? (y que par=E1metros y resultados sean tipos est=
=E1ndares o que sigan alguna regla)<br></div></div></blockquote><div><br></=
div>


</div><div>Calling conventions. Le=E9 todo lo de arriba y despu=E9s seguimo=
s. Fij=E1te lo del empaquetamiento.</div><div>A todo esto: por qu=E9 quer=
=E9s a tanta costa forzar algo para lo que no fue pensado y para lo que no =
es natural? (compatibilidad binaria en C)</div>

<div><div></div><div>
<div><br></div><div>=A0</div><blockquote class=3D"gmail_quote" style=3D"mar=
gin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class=3D"g=
mail_quote"><div><br>Gracias por las respuestas!<br>Espero que te mejores d=
e la angina.<br>



=A0</div><div><div></div><div><blockquote class=3D"gmail_quote" style=3D"ma=
rgin:0pt 0pt 0pt 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:=
1ex"><div><br><div class=3D"gmail_quote">
2012/3/30 Joaquin Duo <span dir=3D"ltr">&lt;<a href=3D"mailto:joaduo@gmail.=
com" target=3D"_blank">joa...@gmail.com</a>&gt;</span><br><blockquote class=
=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padd=
ing-left:1ex">



<div><div>Hola Lista!<br>
Gracias por sus respuestas!<br><br>Dise=F1ando el sistema de plugins me han=
 surgido ciertas dudas.<br>Mi idea en el dise=F1o es que los plugins se pue=
dan compilar con diferentes compiladores, y que la compatibilidad con el si=
stema tenga larga duraci=F3n.<br>






En otras palabras, que no haga falta compilar nuevamente el plugin si cambi=
a el compilador.<br>Aunque no es un requisito fundamental me interesa saber=
 c=F3mo se comportan las compatibilidades entre compiladores.<br><br>1- Res=
pecto al name mangling:<br>






Tengo entendido que el name mangling cambia de un compilador a otro. Pero t=
ambi=E9n de una versi=F3n a otra, no?<br>No existe ahora un est=E1ndar que =
diga c=F3mo deber=EDa ser el name mangling?<br>S=ED o s=ED tengo que compil=
ar los plugins con la misma versi=F3n (o versiones cercanas) del compilador=
?<br>






Cu=E1les son los l=EDmites?<br><br>Suponiendo que evito el problema usando =
una funci=F3n de interface &#39;extern &quot;C&quot;&#39;.<br>Qu=E9 compati=
bilidad hay a nivel l=F3gico/de compilaci=F3n entre compiladores?<br><br>Su=
poniendo los siguientes pasos:<br>





1- ambos compiladores leen la misma definici=F3n de una clase.<br>
2- el n=FAcleo de la aplicaci=F3n es compilado con un compilador A, que usa=
 esa clase<br>3- el plugin es compilado con el compilador B, que usa la cla=
se.<br>4- el n=FAcleo carga la librer=EDa y recibe, luego de llamar una fun=
ci=F3n de la librer=EDa,  un puntero a la clase creada por B.<br>





Pueden haber incompatibilidades?<br><br>2- Respecto a RTTI:<br>Tengo las mi=
smas dudas que para las compatibilidades entre clases.<br>Qu=E9 sucede con =
el RTTI en diferentes compiladores? Hay incompatibilidades?<br><br>Espero q=
ue la pregunta sea interesante.<br>





Gracias desde ya!<br></div></div><br></blockquote></div></div></blockquote>=
</div></div></div><div><div></div><div>

<p></p>

-- <br>
=BFEres miembro de &quot;CyC++ Buenos Aires&quot; verdad? Si no lo eres, ha=
s recibido este mesaje por error. <br>
En caso de duda visita &quot;<a href=3D"http://groups.google.com/group/cppb=
a" target=3D"_blank">http://groups.google.com/group/cppba</a>&quot;</div></=
div></blockquote></div></div></div><br><br clear=3D"all"><div><div></div><d=
iv>

<div><br></div>-- <br>Who=92s got the sweetest disposition?<br>
One guess, that=92s who?<br>Who=92d never, ever start an argument?<br>Who n=
ever shows a bit of temperament?<br>Who&#39;s never wrong but always right?=
<br>Who&#39;d never dream of starting a fight?<br>Who get stuck with all th=
e bad luck? <br>



</div></div></blockquote></div><br><br clear=3D"all"><div><br></div>-- <br>=
Who=92s got the sweetest disposition?<br>One guess, that=92s who?<br>Who=92=
d never, ever start an argument?<br>Who never shows a bit of temperament?<b=
r>Who&#39;s never wrong but always right?<br>

Who&#39;d never dream of starting a fight?<br>Who get stuck with all the ba=
d luck? <br>
</div></div></div>
</blockquote></div><br><br clear=3D"all"><div><br></div>-- <br>Who=92s got =
the sweetest disposition?<br>One guess, that=92s who?<br>Who=92d never, eve=
r start an argument?<br>Who never shows a bit of temperament?<br>Who&#39;s =
never wrong but always right?<br>
Who&#39;d never dream of starting a fight?<br>Who get stuck with all the ba=
d luck? <br>
</div>

--20cf307abcdd2f719304bc7abc34--