[PATCH][lld][PECOFF] Add Support for entry point symbol name
Rui Ueyama
ruiu at google.com
Mon Aug 12 14:58:44 PDT 2013
Code mostly looks good, some nits.
> +// Sets a default entry point symbol name depending on context image
type and
> +// subsystem. These default names are MS CRT compliant.
> +void setDefaultEntrySymbolName(PECOFFLinkingContext &context)
> +{
> + if (context.getImageType() ==
PECOFFLinkingContext::ImageType::IMAGE_DLL)
> + context.setEntrySymbolName("_DllMainCRTStartup");
> + else {
nit: we usually use {} if "else" has takes a block.
> + llvm::COFF::WindowsSubsystem subsystem = context.getSubsystem();
> + if (subsystem ==
llvm::COFF::WindowsSubsystem::IMAGE_SUBSYSTEM_WINDOWS_GUI)
> + context.setEntrySymbolName("WinMainCRTStartup");
> + else if (subsystem ==
> + llvm::COFF::WindowsSubsystem::IMAGE_SUBSYSTEM_WINDOWS_CUI)
> + context.setEntrySymbolName("mainCRTStartup");
> + }
> +}
You may want to add an underscore at the beginning of the symbols. That
symbol
mangling is needed only on Windows/x86, so we will have to add "_" only
when on
x86, but currently we are hard-coding the underscore.
> // Parses the given command line options and returns the result. Returns
NULL if
> // there's an error in the options.
> std::unique_ptr<llvm::opt::InputArgList> parseArgs(int argc, const char
*argv[],
> @@ -356,6 +372,8 @@ bool WinLinkDriver::parse(int argc, const char
*argv[],
> // handle /entry
> if (llvm::opt::Arg *arg = parsedArgs->getLastArg(OPT_entry))
> context.setEntrySymbolName(arg->getValue());
> + else
> + setDefaultEntrySymbolName(context);
nit: brace
> + void setAddressOfEntryPoint(TextSectionChunk *text, PEHeaderChunk
*peHeader) {
> + // Find the virtual address of the entry point symbol if any.
> + // PECOFF spec says that entry point for dll images is optional, in
which
> + // case it must be set to 0.
> + if (_PECOFFLinkingContext.entrySymbolName().empty() &&
> + _PECOFFLinkingContext.getImageType() ==
PECOFFLinkingContext::IMAGE_DLL)
> + peHeader->setAddressOfEntryPoint(0);
> + else {
nit: brace
On Mon, Aug 12, 2013 at 12:49 PM, Jesús Serrano <dagonoweda at gmail.com>wrote:
> On 31/07/2013 2:13, Reid Kleckner wrote:
>
> On Tue, Jul 30, 2013 at 4:12 PM, Chandler Carruth <chandlerc at google.com>wrote:
>
>>
>> On Tue, Jul 30, 2013 at 3:46 PM, Jesús Serrano García <
>> dagonoweda at gmail.com> wrote:
>>
>>> Looks like the entry function name should be _mainCRTStartup if
>>> subsystem is "console",
>>> _WinMainCRTStartup if subsystem is "windows", and "__DllMainCRTStartup"
>>> for DLL.
>>> See http://msdn.microsoft.com/en-us/library/f9t8842e(v=vs.80).aspx.
>>>
>>> I think this is rather a Visual Studio convention for its C runtime
>>> library, and the PECOFF spec says nothing about it, so I though that
>>> "_main" is a good default entry point name, taking into account that
>>> there is currently no CRT guidelines (or at least I'm unaware of them) in
>>> the lld project.
>>
>>
>> Sorry for the ambiguity, but the goal of all the PECOFF work in LLD is
>> to support linking in a compatible way for Windows. If you have another
>> usecase for linking PECOFF, you should raise that on the discussion list
>> (not the commit list) as it'll need a separate design from what we're
>> currently working on.
>>
>> For now, as Rui has said, we should follow the MSDN spec he cited.
>>
>
> Maybe the driver should call setEntrySymbolName() with a default if the
> user didn't specify anything. Then the link.exe driver could use the
> Microsoft name and the GNU ld driver can use main / _main.
>
> I've attached a new patch with this changes. Now the windows driver sets
> the entry symbol name according to the corresponding options. However, this
> won't work in all cases. Depending on whether the crt is compiled as
> multibyte or unicode, the entry point symbol name changes from
> "mainCRTStartup" to "wmainCRTStartup", and the same for the windows
> subsystem. The problem with this is that the use of unicode is unknown at
> link time (or at least I don't know how to retrieve this option from object
> files). One possible solution would be to have two entry point names in
> the linking context, and find a symbol mathing any of them, but I don't
> like it so much. Any ideas on this?
>
> Also, I'd like to add some tests for this feature, but I'm still learning
> how the test system works.
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20130812/12991759/attachment.html>
More information about the llvm-commits
mailing list