On Wednesday 29 May 2002 22:40, Eric Pouech wrote:
I thought about modifying winebuild to add
char _end[]; nt_headers->OptionalHeader.SizeOfImage = pe_header - _end;
in the library initialisation function. This is small, fast and probably more accurate.
Does anyone have any comment about that ?
don't you mean extern char _end[] instead ?
Yes, sorry.
there's nothing currently which ensures that pe_header is at the start of the code (it relies on the fact it's the first on gcc/ld link option, and that ld allocates slots for compilation units in the order they are expressed) => this may become a porting issue I'm not sure either that _end is completly portable?
I don't know either. We could instead add a linker script which would set a symbol to the difference between the end and the start of the file. That should be more portable.
using this technique (with _start, _etext, _edata, _bss_start, _end) we could also compute the "real" size of code, data, and bss which should be of some interest (even if data would be a bit more difficult, since we need to take care of the rsrc part)
One thing at a time please :-)
I tried the code described above, but it unfortunately doesn't work for all dlls. It returns a correct value in some cases (for small dlls it seems), and a huge negative value around 0xc0000000 in other cases (for bigger dlls).
I check the pe_header and _end symbols using nm and they are correct everytime.
I then checked the assembly code generated by gcc, and found out that _end - pe_header is computed by reading 2 valus in the .got section and substracting them.
Could anyone help me ?
Should I try with a linker script ?
Laurent Pinchart