Re: Weak globals
Joe Pluta <joepluta-Kokj9vFzZubAKuVPhbf8BAC/[email protected]> Tue, 2 Apr 2019 10:07:01 -0500
| Newsgroups | gmane.comp.lang.as400.c |
|---|---|
| Message-ID | <[email protected]> |
Yes, I do. It's going to take a little while because I want the whole package. Another anomaly is that the syntax does NOT work with the C compiler, including the alternate syntax described in the manual: https://www.ibm.com/support/knowledgecenter/en/ssw_ibm_i_73/rzarg/function_attributes.htm So I'll put together my test cases and reach out to the fine folks. On 4/2/2019 10:00 AM, Mark Waterbury wrote: > Joe, > Sounds like it may be time to open a Support incident with IBM (PMR) to get some clarification -- maybe it's a defect and they might accept it as an APAR that may eventually result in PTFs? :) And, you already have a nice simple little "test case" to submit with your PMR ... ;-) > > Good luck, > Mark S. Waterbury > > On Tuesday, April 2, 2019, 10:54:31 AM EDT, Joe Pluta <[email protected]> wrote: > > 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