[LinuxBIOS] printk()/post_code(): Compile failure for all hardware targets in v3
Carl-Daniel Hailfinger
c-d.hailfinger.devel.2006 at gmx.net
Tue Nov 20 17:44:02 CET 2007
On 20.11.2007 14:14, Stefan Reinauer wrote:
> * Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006 at gmx.net> [071120 11:46]:
>
>> The reason is similar for all of them:
>> include/console.h specifies
>>
>>> void post_code(u8 value);
>>>
>> include/post_code.h specifies (because _SHARED is defined)
>>
>>> void stage0_post_code(u8 value) ;
>>> void (*post_code)(u8 value) = stage0_post_code;
>>>
>> Of course these definitions do conflict.
>>
>
> This issue seems trivial. include/console.h must not define a prototype
> for post_code. I wonder how that double definition sneaked.
>
Because simply deleting it causes compilation problems somewhere else?
>> * The conflicting post_code() definitions above are not alone, the same
>> happens for printk.
>>
>
> How so? I could not find a printk prototype in any other file. Where's
> the bad part?
>
Maybe I mixed that up with the multiple printk definitions below.
>> * If you remove post_code() from include/console.h everywhere
>> post_code() is shared, you encounter the next problem: If two files with
>> _SHARED are linked together, each of them will contain the assignment
>> (*post_code)=stage0_post_code, resulting in linker errors because a
>> symbol appears twice.
>>
>
> This is interesting. I never had any of these problems and I have been
> testing that code quite a bit. What distribution and what toolchain are
> you using?
>
openSUSE 10.3 (i386)
gcc (GCC) 4.2.1 (SUSE Linux)
GNU ld (GNU Binutils) 2.17.50.20070726-14 (SUSE Linux)
>> * Even if you manage to avoid all the problems above, a new problem
>> arises: We have to build a LAR archive in one continuous flow because we
>> can't extract the location of the stage0 symbols from an existing
>> bootblock in a LAR archive and thus can't link initram and stage2
>> against an existing bootblock. Because of that, we never can do partial
>> BIOS updates, which defeats the whole purpose of LAR.
>>
>
> Wait: You can not change the toolchain nor the version of the bootblock
> in between. This is only a rather small limitation. But its not very
> elegant, I agree.
>
My point was: For a given bootblock, we can't build the rest of the ROM
based on the bootblock alone because it has been stripped of symbols.
> Which is why I suggested a function pointer array with defined function
> pointers at fixed, defined offsets. Yes. This means we have to define an
> interface, something the Linux guys really hate.
>
I see no way around a function pointer array. However, we could avoid
the fixed offsets if we use the same technology the Linux kernel uses
for its symbol tables.
> The Amiga did a very similar thing. All functions in a shared library
> would be available through a function pointer array. The callable
> functions would be defined through the library version. So a program
> could always react on finding a too old or not-existing library sanely
> instead of just spitting out a linker error like our unix/elf based systems
> do these days.
>
That's probably overkill.
>> Suggestions for solving the problems mentioned above:
>> * Always wrap shared function definitions in SHARED macros.
>>
> yes. this is how it should be done.
>
Can you prepare a patch?
>> * Make sure the assignment "ret (*func)(args) attr= stage0_##func"
>> happens only once per final linked object.
>>
>
> agreed.
>
That will get messy. Maybe move the assignment to a separate object
which is linked to the final object?
>> * Include a .map file of shared stage0 functions in the LAR.
>>
>
> My first thought. but the map file is not sufficient for linking with
> those symbols. You need the object file for that. Which is bad.
>
Can we recreate an object file from the map file? Or can we avoid
stripping all symbols from stage0/1?
Regards,
Carl-Daniel
More information about the coreboot
mailing list