Re: Weak globals
Joe Pluta <joepluta-Kokj9vFzZubAKuVPhbf8BAC/[email protected]> Tue, 2 Apr 2019 09:54:18 -0500
| Newsgroups | gmane.comp.lang.as400.c |
|---|---|
| Message-ID | <[email protected]> |
Sadly, it's quite inconsistent.
This works in CRTSRVPGM:
// Compilation unit 2:
#include <stdio.h>
void foo() __attribute__((weak));
void foo()
{
printf("Foo called from compilation unit 2.\n");
}
I am able to create the service program and it looks like the symbols
resolved correctly. But before I test that, I tried to do CRTPGM with
the same modules (remember that TFOO1 has a proper main). That failed
with CPD5D03 and the listing showed that the TFOO2 definition was being
treated as a strong global.
So:
#pragma weak doesn't work in CRTSRVPGM or CRTPGM
__attribute__((weak)) works in CRTSRVPGM
Neither works in CRTPGM
Ugh. I'll try the service program in a moment, just to see if calling
routines resolve correctly.
On 4/2/2019 9:20 AM, Joe Pluta wrote:
> It looks like the #pragma weak is just not working. Here's the
> relevant CRTSRVPGM output:
>
> 5770SS1 V7R3M0 160422 MVXJP/TFOO DEV 04/02
> Module . . . . . . . . . . . : TFOO2
> Library . . . . . . . . . : MVXJP
> Bound . . . . . . . . . . : *YES
> Change date/time . . . . . : 04/02/19 07:39:13
> Teraspace storage enabled : *YES
> Storage model . . . . . . : *SNGLVL
> Number Symbol Ref
> Identifier Type Scope Export
> 00000025 Def foo__Fv Proc Module Strong
> 00000026 Ref 0000011C _C_SIGABRT_ctl_action Data
>
> Note that foo__Fv in TFOO2 is identified as a strong export. That's
> just not correct. It later conflicts with the foo__Fv from TFOO3 and
> the service program is not created.
>
>
>
> On 4/2/2019 9:12 AM, Joe Pluta wrote:
>> Nope - still getting CPD5D03.
>>
>> On 4/2/2019 9:08 AM, Joe Pluta wrote:
>>> Thanks Jon, that's the way I'll go if I can't figure anything else
>>> out. As you probably guess, I don't like DUPPROC, especially since
>>> as I read the documentation, weak should work.
>>>
>>> The EXPORT(*ALL) is simply for testing, but I'm not sure how the
>>> binder source would help. I'm not very versed in binder source, but
>>> as far as I can tell all binder source does is order the exported
>>> modules. How would it help when resolving duplicate symbols?
>>>
>>> Oh wait. Maybe that's the problem! Maybe it's trying to export both
>>> the weak and the strong. Ah, let me try that. If I add binder
>>> source to only export main maybe that will work.
>>>
>>>
>>> On 4/2/2019 8:53 AM, Jon Paris wrote:
>>>> Joe - I think dup proc is the only way to go. As to your comment
>>>> "and even then the order isn't _guaranteed_" that should be dealt
>>>> with by binder language/source instead of doing Export *All. That
>>>> guarantees the slot sequence.
>>>>
>>>>
>>>> Jon Paris
>>>>
>>>> www.partner400.com
>>>> www.SystemiDeveloper.com
>>>>
>>>>> On Apr 2, 2019, at 8:43 AM, Joe Pluta <[email protected]>
>>>>> wrote:
>>>>>
>>>>> Has anybody successfully used the weak #pragma for a function?
>>>>> I'm trying to create a service program with three modules: one
>>>>> that references a function, one with that function defined weakly,
>>>>> and one with the function defined strongly. In that scenario, I
>>>>> should be able to combine the following:
>>>>>
>>>>> Reference, weak: calls weak
>>>>> Reference, strong: calls strong
>>>>> Reference, weak, strong: calls strong
>>>>> Reference only: won't compile
>>>>>
>>>>> The best example code I found was in the AIX reference:
>>>>>
>>>>> https://www.ibm.com/support/knowledgecenter/SSGH3R_13.1.0/com.ibm.xlcpp131.aix.doc/compiler_ref/prag_weak.html
>>>>>
>>>>>
>>>>> From what I can tell, that same syntax should work in the ILE
>>>>> compiler, so I created the following:
>>>>>
>>>>> |// TFOO1.CPP #include <stdio.h> void foo(); int main() { foo(); }
>>>>> // TFOO2.CPP #include <stdio.h> #pragma weak foo__Fv void foo() {
>>>>> printf("Foo called from compilation unit 2\n"); } // TFOO3.CPP
>>>>> #include <stdio.h> void foo() { printf("Foo called from
>>>>> compilation unit 3\n"); } |
>>>>>
>>>>>
>>>>> CRTSRVPGM TFOO MODULES(TFOO1 TFOO2 TFOO3) EXPORT(*ALL) fails with
>>>>> CPD5D03, Definition supplied multiple times for symbol 'foo__Fv'.
>>>>>
>>>>> I can get around it with OPTION(*DUPPROC) but then I have to be
>>>>> very careful of the order of my modules in the MODULES keyword of
>>>>> CRTSRVPGM (and even then the order isn't _guaranteed_). That also
>>>>> would hide any cases of unintentional procedure duplication, so
>>>>> I'd really like to get #pragma weak working.
>>>>>
>>>>>
>>>>> --
>>>>> This is the Bare Metal Programming IBM i (AS/400 and iSeries)
>>>>> (C400-L) mailing list
>>>>> To post a message email: [email protected]
>>>>> To subscribe, unsubscribe, or change list options,
>>>>> visit: https://lists.midrange.com/mailman/listinfo/c400-l
>>>>> or email: [email protected]
>>>>> Before posting, please take a moment to review the archives
>>>>> at https://archive.midrange.com/c400-l.
>>>>>
>>>>> Help support midrange.com by shopping at amazon.com with our
>>>>> affiliate
>>>>> link: https://amazon.midrange.com
>>>
>>>
>>
>
--
This is the Bare Metal Programming IBM i (AS/400 and iSeries) (C400-L) mailing list
To post a message email: [email protected]
To subscribe, unsubscribe, or change list options,
visit: https://lists.midrange.com/mailman/listinfo/c400-l
or email: [email protected]
Before posting, please take a moment to review the archives
at https://archive.midrange.com/c400-l.
Help support midrange.com by shopping at amazon.com with our affiliate
link: https://amazon.midrange.com