[PATCH 1/3] makedep: Align PE sections so they can be mmapped.
jacek at codeweavers.com
Fri May 29 07:57:14 CDT 2020
On 27.05.2020 13:49, Rémi Bernon wrote:
> On 5/25/20 5:26 PM, Jacek Caban wrote:
>> On 25.05.2020 16:32, Rémi Bernon wrote:
>>> I could also see that some CROSSDEBUG checks look for "split" prefix in
>>> makedep, and some other set the variable to dwarf. It's not clear to me
>>> what this variable is supposed to be set to (other than "pdb"). Does
>>> "dwarf" mean separate file as well?
>> No, "dwarf" means that debug info will be embedded in module PE
>> files, which has always been the default. "dwarf" part of
>> "split-dwarf" is important for configure script to apply
>> dwarf-specific flags. "dwarf," "split-dwarf" and "pdb" are the only
>> configs for which I know a real use, but in theory you could set it
>> to anything else as long as you take care of CROSSCFLAGS yourself.
>> "stabs" and "split-stabs" should be in theory achievable this way
>> (but I didn't try).
> Alright. So, "split*" means that the debug sections are extracted to a
> separate file, and, currently, this file is also a PE file, as the
> default objcopy operation is to use the same output format as the
> source file.
> Having the debug section in an ELF file instead in this case shouldn't
> be an issue right? Gdb and any other tool that were already able to
> parse DWARF from PE files should be able to parse DWARF from ELF
> without trouble. Using an ELF container allows perf to read it. I
> don't think there's anything that requires PE container with DWARF
> debug info, but maybe there is?
> Regarding the default name and location of this ELF module, I see that
> we already implement in dbghelp the same logic as gdb does, which
> includes looking for .debug/debugfile, where debugfile is the contents
> of GNU debuglink, so this should work fine as well, while at the same
> time making perf work OOTB.
> From a quick test, as long as the .debug folder is also copied
> alongside the dll in the prefix, both winedbg and winedbg --gdb are
> happy with the ELF container.
> So, in the end, although I understand the root issue is some
> limitation of perf itself, this feels much simpler to fix in Wine with
> these small tweaks that makes every tool happy, than to try
> implementing PE support in perf. I think it would require much more
> work there, and would be way harder to justify if it were to be
> upstreamed (this is clearly a Wine specific use-case and I'm not sure
> how eager perf maintainers would be to have huge code changes just for
> the sake of PE module parsing).
Yes, I agree that it could all work, I even made sure that dbghelp.dll
can handle it when I was adding support for debug links in PE. I'm not
against (at least part) of the patchset. But the thing is that it's
quite a lot of perf-specific tweaking. Even if we take those patches, it
would still be interesting to be better supported by perf, so why not at
least evaluate it first.
I took a quick look at perf sources and I'm not convinced that it would
be hard. It already has some abstraction, see dso_binary_type enum and
its usage. It already has special cases for things like
DSO_BINARY_TYPE__JAVA_JIT, so DSO_BINARY_TYPE__PE doesn't seem out of
place. The amount of PE understanding that perf would need to find debug
info is very minimal: it just needs to be able to enumerate sections.
The above is about two other patches. I didn't look at PE alignment fix,
but I just expect that it should be fixable upstream. With that in mind,
my comments to patches:
- PE alignment
The patch breaks build with llvm-mingw because lld doesn't support
--file-alignment. It's also not exactly free. Note that you could just
pass CROSSLDFLAGS=... to configure instead of patching Wine.
- .debug directory
I don't have a strong opinion here. If it's indeed a standard, maybe we
should follow it. GDB documentation mentions both %s.debug and .debug/%s
and, not being a fan of hidden directories in build tree, I chose the
one that seemed nicer:
- symbols in ELF file
We could do that, creating an exotic mix then building on mac, with PE,
Mach-O and ELF files. Another option would be
CROSSLDFLAGS=-Wl,--objcopy,-Oelf64-x86-64, but it doesn't seem nice...
More information about the wine-devel