diff options
author | Chris Lattner <sabre@nondot.org> | 2007-06-19 16:46:48 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2007-06-19 16:46:48 +0000 |
commit | 3f931b8c0e3f27aeb52d8acf209c64e182defb3f (patch) | |
tree | aa82033a0cced7b50e0330e14b501e307b5d145f /tools | |
parent | 5cec4db6ae13a41d04d86f37e347fc5b5997c948 (diff) | |
download | external_llvm-3f931b8c0e3f27aeb52d8acf209c64e182defb3f.zip external_llvm-3f931b8c0e3f27aeb52d8acf209c64e182defb3f.tar.gz external_llvm-3f931b8c0e3f27aeb52d8acf209c64e182defb3f.tar.bz2 |
Fix pr1448
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@37658 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'tools')
-rw-r--r-- | tools/llvm-ld/llvm-ld.cpp | 34 |
1 files changed, 20 insertions, 14 deletions
diff --git a/tools/llvm-ld/llvm-ld.cpp b/tools/llvm-ld/llvm-ld.cpp index 9b3e66d..c86341f 100644 --- a/tools/llvm-ld/llvm-ld.cpp +++ b/tools/llvm-ld/llvm-ld.cpp @@ -326,46 +326,52 @@ static int GenerateNative(const std::string &OutputFilename, // We can't just assemble and link the file with the system assembler // and linker because we don't know where to put the _start symbol. // GCC mysteriously knows how to do it. - std::vector<const char*> args; + std::vector<std::string> args; args.push_back(gcc.c_str()); args.push_back("-fno-strict-aliasing"); args.push_back("-O3"); args.push_back("-o"); - args.push_back(OutputFilename.c_str()); - args.push_back(InputFilename.c_str()); + args.push_back(OutputFilename); + args.push_back(InputFilename); // Add in the library paths for (unsigned index = 0; index < LibPaths.size(); index++) { args.push_back("-L"); - args.push_back(LibPaths[index].c_str()); + args.push_back(LibPaths[index]); } // Add the requested options for (unsigned index = 0; index < XLinker.size(); index++) { - args.push_back(XLinker[index].c_str()); - args.push_back(Libraries[index].c_str()); + args.push_back(XLinker[index]); + args.push_back(Libraries[index]); } // Add in the libraries to link. for (unsigned index = 0; index < LinkItems.size(); index++) if (LinkItems[index].first != "crtend") { - if (LinkItems[index].second) { - std::string lib_name = "-l" + LinkItems[index].first; - args.push_back(lib_name.c_str()); - } else - args.push_back(LinkItems[index].first.c_str()); + if (LinkItems[index].second) + args.push_back("-l" + LinkItems[index].first); + else + args.push_back(LinkItems[index].first); } - args.push_back(0); + + // Now that "args" owns all the std::strings for the arguments, call the c_str + // method to get the underlying string array. We do this game so that the + // std::string array is guaranteed to outlive the const char* array. + std::vector<const char *> Args; + for (unsigned i = 0, e = args.size(); i != e; ++i) + Args.push_back(args[i].c_str()); + Args.push_back(0); if (Verbose) { cout << "Generating Native Executable With:\n"; - PrintCommand(args); + PrintCommand(Args); } // Run the compiler to assembly and link together the program. int R = sys::Program::ExecuteAndWait( - gcc, &args[0], (const char**)clean_env, 0, 0, 0, &ErrMsg); + gcc, &Args[0], (const char**)clean_env, 0, 0, 0, &ErrMsg); delete [] clean_env; return R; } |