WIN32: Linking with the CRT at runtime. (#570)
Disclaimer: Forgive me if my format sucks, I've never submitted a PR before! Fixes: #517 I added a few things to allow zig to link with the CRT properly both statically and dynamically. In Visual Studio 2017, Microsoft changed how the c-runtime is factored again. With this change, they also added a COM interface to allow you to query the respective Visual Studio instance for two of them. This does that and also falls back on a registry query for 2015 support. If you're using a Visual Studio instance older than 2015, you'll have to use the existing options available with the zig compiler. Changes are listed below along with a general description of the changes. all_types.cpp: The separate variables for msvc/kern32 have been removed and all win32 libc directory paths have been combined into a ZigList since we're querying more than two directories and differentiating one from another doesn't matter to lld. analyze.cpp: The existing functions were extended to support querying libc libs & libc headers at runtime. codegen.cpp/hpp: Microsoft uses the new 'Universal C Runtime' name now. Doesn't matter from a functionality standpoint. I left the compiler switches as is to not introduce any breaking changes. link.cpp: We're linking 4 libs and generating another in order to support the UCRT. Dynamic: msvcrt/d, vcruntime/d, ucrt/d, legacy_stdio_definitions.lib Static: libcmt/d, libvcruntime/d libucrt/d, legacy_stdio_definitions.lib main.cpp: Update function call names. os.cpp/hpp: COM/Registry interface for querying Windows UCRT/SDK. Sources: [Windows CRT](https://docs.microsoft.com/en-us/cpp/c-runtime-library/crt-library-features) [VS 2015 Breaking Changes](https://msdn.microsoft.com/en-us/library/bb531344.aspx)
This commit is contained in:
23
src/link.cpp
23
src/link.cpp
@@ -402,19 +402,25 @@ static void construct_linker_job_coff(LinkJob *lj) {
|
||||
lj->args.append(buf_ptr(buf_sprintf("-OUT:%s", buf_ptr(&lj->out_file))));
|
||||
|
||||
if (g->libc_link_lib != nullptr) {
|
||||
lj->args.append(buf_ptr(buf_sprintf("-LIBPATH:%s", buf_ptr(g->msvc_lib_dir))));
|
||||
lj->args.append(buf_ptr(buf_sprintf("-LIBPATH:%s", buf_ptr(g->kernel32_lib_dir))));
|
||||
|
||||
lj->args.append(buf_ptr(buf_sprintf("-LIBPATH:%s", buf_ptr(g->libc_lib_dir))));
|
||||
lj->args.append(buf_ptr(buf_sprintf("-LIBPATH:%s", buf_ptr(g->libc_static_lib_dir))));
|
||||
if (g->libc_link_lib != nullptr) {
|
||||
for (uint32_t i = 0; i < g->libc_lib_dirs_list.length; ++i) {
|
||||
lj->args.append(buf_ptr(buf_sprintf("-LIBPATH:%s", buf_ptr(g->libc_lib_dirs_list.items[i]))));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (lj->link_in_crt) {
|
||||
const char *lib_str = g->is_static ? "lib" : "";
|
||||
const char *d_str = (g->build_mode == BuildModeDebug) ? "d" : "";
|
||||
|
||||
Buf *cmt_lib_name = buf_sprintf("libcmt%s.lib", d_str);
|
||||
lj->args.append(buf_ptr(cmt_lib_name));
|
||||
if (g->is_static) {
|
||||
Buf *cmt_lib_name = buf_sprintf("libcmt%s.lib", d_str);
|
||||
lj->args.append(buf_ptr(cmt_lib_name));
|
||||
}
|
||||
else {
|
||||
Buf *msvcrt_lib_name = buf_sprintf("msvcrt%s.lib", d_str);
|
||||
lj->args.append(buf_ptr(msvcrt_lib_name));
|
||||
}
|
||||
|
||||
Buf *vcruntime_lib_name = buf_sprintf("%svcruntime%s.lib", lib_str, d_str);
|
||||
lj->args.append(buf_ptr(vcruntime_lib_name));
|
||||
@@ -422,6 +428,9 @@ static void construct_linker_job_coff(LinkJob *lj) {
|
||||
Buf *crt_lib_name = buf_sprintf("%sucrt%s.lib", lib_str, d_str);
|
||||
lj->args.append(buf_ptr(crt_lib_name));
|
||||
|
||||
//Visual C++ 2015 Conformance Changes
|
||||
//https://msdn.microsoft.com/en-us/library/bb531344.aspx
|
||||
lj->args.append("legacy_stdio_definitions.lib");
|
||||
|
||||
//if (shared || dll) {
|
||||
// lj->args.append(get_libc_file(g, "dllcrt2.o"));
|
||||
|
||||
Reference in New Issue
Block a user