This is the mail archive of the crossgcc@sourceware.org mailing list for the crossgcc project.
See the CrossGCC FAQ for lots more information.
| Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
|---|---|---|
| Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
| Other format: | [Raw text] | |
On 11 August 2006 16:27, Rowan Potgieter wrote:
>> I think that will be your underlying trouble: you're getting the post-3.2
>> behaviour but the source was written originally for a pre-3.2 compiler.
>
> hmmm so are saying that i'm going to have to rebuild the toolchain,
> perhaps using an older version of gcc? pre 3.2? isn't that worse
> though?
Nope, it will be much easier to hack the source to update it:
>> So, what's actually on line 179 before __FUNCTION__ ?
>
> Copying from line 177-179:
> /* This is really only for debugging. */
> if (NSS_STATUS_TRYAGAIN > status || status > NSS_STATUS_RETURN)
> __libc_fatal ("illegal status in " __FUNCTION__);
>
> I dont know if that helps...
Absolutely it does. In old gcc, __FUNCTION__ was a string, so that line
looks like this:
> if (NSS_STATUS_TRYAGAIN > status || status > NSS_STATUS_RETURN)
> __libc_fatal ("illegal status in " "internal_getgrouplist");
and it's using preprocessor string contcatenation to make that into one
message. But the new way of doing things, __FUNCTION__ is effectively a
variable like __func__:
>> The identifier `__func__' is implicitly declared by the translator
>> as if, immediately following the opening brace of each function
>> definition, the declaration
>> static const char __func__[] = "function-name";
>>
>> appeared, where function-name is the name of the lexically-enclosing
>> function. This name is the unadorned name of the function.
>>
>> By this definition, `__func__' is a variable, not a string literal.
>> In particular, `__func__' does not catenate with other string literals.
Note that last line: what you have with modern gcc is effectively
> static const char __FUNCTION__[] = "internal_getgrouplist";
>
> if (NSS_STATUS_TRYAGAIN > status || status > NSS_STATUS_RETURN)
> __libc_fatal ("illegal status in " __FUNCTION__);
and of course, you can't concatenate the runtime contents of a variable with a
literal string at compile time!
I don't know if __libc_fatal accepts format specifiers, but if it does, the
solution /could/ be as simple as rewriting it to
> if (NSS_STATUS_TRYAGAIN > status || status > NSS_STATUS_RETURN)
> __libc_fatal ("illegal status in %s", __FUNCTION__);
otherwise, you'd need to strcat or sprintf it into a temporary buffer, or just
make do without the function name, or hard-code it into the error message:
> if (NSS_STATUS_TRYAGAIN > status || status > NSS_STATUS_RETURN)
> __libc_fatal ("illegal status in internal_getgrouplist");
cheers,
DaveK
--
Can't think of a witty .sigline today....
--
For unsubscribe information see http://sourceware.org/lists.html#faq
| Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
|---|---|---|
| Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |