Skip to content

Windows DllMain name is exported #67399

Open

Description

On Windows, Rust exports the name of DllMain (std) / _DllMainCRTStartup (no_std), which is not standard behaviour and unwanted in most cases (that I am aware of). As far as I understand this happens because they must be marked with either #[no_mangle] or #[export_name = ".."] so the link.exe can find the symbol. The extern keyword must also be used to mark them as stdcall for 32 bit targets.

Example project:

  • Cargo.toml

    [lib]
    crate-type = ["cdylib"]
  • lib.rs (std)

    #[no_mangle]
    extern "system" fn DllMain(_: *const u8, _: u32, _: *const u8) -> u32 { 1 }
  • lib.rs (no_std)

    #![no_std]
    
    #[panic_handler]
    fn panic(_: &core::panic::PanicInfo) -> ! { loop {} }
    
    #[no_mangle]
    extern "system" fn _DllMainCRTStartup(_: *const u8, _: u32, _: *const u8) -> u32 { 1 }

dumpbin output

  • Example Windows dll file:

    Dump of file C:\Windows\System32\httpprxp.dll
    
    File Type: DLL
    
      Section contains the following exports for httpprxp.dll
    
        00000000 characteristics
            0.00 version
               1 ordinal base
               8 number of functions
               8 number of names
    
        ordinal hint RVA      name
    
              1    0 00001870 ProxyHelperGetProxyEventInformation
              2    1 00001D00 ProxyHelperProviderConnectToServer
              3    2 00001DC0 ProxyHelperProviderDisconnectFromServer
              4    3 000010E0 ProxyHelperProviderFreeMemory
              5    4 00001220 ProxyHelperProviderRegisterForEventNotification
              6    5 00001AC0 ProxyHelperProviderSetProxyConfiguration
              7    6 00001BA0 ProxyHelperProviderSetProxyCredentials
              8    7 00001620 ProxyHelperProviderUnregisterEventNotification
    
      Summary
    
            1000 .data
            1000 .didat
            1000 .pdata
            2000 .rdata
            1000 .reloc
            1000 .rsrc
            2000 .text
    
  • Rust example from above (std):

    Dump of file std.dll
    
    File Type: DLL
    
      Section contains the following exports for std.dll
    
        00000000 characteristics
            0.00 version
               1 ordinal base
               2 number of functions
               2 number of names
    
        ordinal hint RVA      name
    
              1    0 00001000 DllMain = DllMain
              2    1 00001010 rust_eh_personality = rust_eh_personality
    
      Summary
    
            1000 .data
            1000 .pdata
            1000 .rdata
            1000 .reloc
            1000 .text
    
  • Rust example from above (no_std):

    Dump of file no_std.dll
    
    File Type: DLL
    
      Section contains the following exports for no_std.dll
    
        00000000 characteristics
            0.00 version
               1 ordinal base
               1 number of functions
               1 number of names
    
        ordinal hint RVA      name
    
              1    0 00001000 _DllMainCRTStartup = _DllMainCRTStartup
    
      Summary
    
            1000 .rdata
            1000 .text
    

Expected output

DllMain and _DllMainCRTStartup should not be exported by name, just as in the first dumpbin output example of a Windows system dll.

Tested compiler version

rustc 1.41.0-nightly (c8ea4ace9 2019-12-14)
binary: rustc
commit-hash: c8ea4ace9213ae045123fdfeb59d1ac887656d31
commit-date: 2019-12-14
host: x86_64-pc-windows-msvc
release: 1.41.0-nightly
LLVM version: 9.0
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Assignees

No one assigned

    Labels

    A-linkageArea: linking into static, shared libraries and binariesArea: linking into static, shared libraries and binariesC-bugCategory: This is a bug.Category: This is a bug.O-windowsOperating system: WindowsOperating system: WindowsO-windows-msvcToolchain: MSVC, Operating system: WindowsToolchain: MSVC, Operating system: WindowsT-compilerRelevant to the compiler team, which will review and decide on the PR/issue.Relevant to the compiler team, which will review and decide on the PR/issue.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions