gnustep-dev
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: error compiling GUI - string constants


From: Ivan Vučica
Subject: Re: error compiling GUI - string constants
Date: Fri, 28 Jul 2017 13:16:45 +0100

On Fri, Jul 28, 2017 at 10:26 AM, David Chisnall <address@hidden> wrote:
On 27 Jul 2017, at 17:06, Fred Kiefer <address@hidden> wrote:
>
>>
>> Am 27.07.2017 um 10:26 schrieb David Chisnall <address@hidden>:
>>
>> On 26 Jul 2017, at 14:58, Josh Freeman <address@hiddencom> wrote:
>>> #if OS_API_VERSION(MAC_OS_X_VERSION_10_6, GS_API_LATEST)
>>> #    define NSPasteboardTypeString NSStringPboardType
>>> #endif
>>
>> Am I missing something?  Why not simply make the first symbol an alias for the second?
>
>
> David, what do you mean by alias?

I thought that GCC had an attribute for it, but apparently not.  The following works on ELF platforms, at least, and there are equivalents for Mach-O:

        #include <stdio.h>
        int x;

        extern int y;
        asm (".weakref y, x");

        int main(void)
        {
                y = 0;
                x = 42;
                // Prints 42
                printf(“%d\n”, y);
        }

So this would work for our use:

        extern NSPasteboardTypeString;
        asm(".weakref NSPasteboardTypeString NSStringPboardType");

We’d end up in the linked binary with a single location with two symbol names.

David

Isn't it this? I'm intentionally grabbing an older version - I'm not sure which is the oldest GCC we support, but 3.4.5 documents alias:

https://gcc.gnu.org/onlinedocs/gcc-3.4.5/gcc/Function-Attributes.html

Quoting:

=====
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. 

====

Though, again, as I asked before: why do we want this?

I'm not sure we *need* anything more than the macro. Wouldn't we need this extra symbol only if we care about better binary compat (maybe for Darling's sake)?

reply via email to

[Prev in Thread] Current Thread [Next in Thread]