From d0b6b7fb7f2ae52703aec0cd07a0d6b2ff5429ce Mon Sep 17 00:00:00 2001 From: Kevin Enderby Date: Thu, 18 Dec 2014 00:53:40 +0000 Subject: [PATCH] =?utf8?q?Add=20printing=20the=20LC=5FLINKER=5FOPTION=20lo?= =?utf8?q?ad=20command=20with=20llvm-objdump=E2=80=99s=20-private-headers.?= =?utf8?q?=20Also=20corrected=20the=20name=20of=20the=20load=20command=20t?= =?utf8?q?o=20not=20end=20in=20an=20=E2=80=99S=E2=80=99=20as=20well=20as?= =?utf8?q?=20corrected=20the=20name=20of=20the=20MachO::linker=5Foption=5F?= =?utf8?q?command=20struct=20and=20other=20places=20that=20had=20the=20wor?= =?utf8?q?d=20option=20as=20plural=20which=20did=20not=20match=20the=20Mac?= =?utf8?q?=20OS=20X=20headers.?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit llvm-svn: 224485 --- llvm/include/llvm/Object/MachO.h | 4 +-- llvm/include/llvm/Support/MachO.h | 6 ++-- llvm/lib/MC/MachObjectWriter.cpp | 6 ++-- llvm/lib/Object/MachOObjectFile.cpp | 6 ++-- .../X86/Inputs/linkerOption.macho-x86_64 | Bin 0 -> 744 bytes .../llvm-objdump/X86/macho-private-headers.test | 13 ++++++++ llvm/tools/llvm-objdump/MachODump.cpp | 33 +++++++++++++++++++++ llvm/tools/macho-dump/macho-dump.cpp | 8 ++--- 8 files changed, 61 insertions(+), 15 deletions(-) create mode 100644 llvm/test/tools/llvm-objdump/X86/Inputs/linkerOption.macho-x86_64 diff --git a/llvm/include/llvm/Object/MachO.h b/llvm/include/llvm/Object/MachO.h index 56a275d..19558a3 100644 --- a/llvm/include/llvm/Object/MachO.h +++ b/llvm/include/llvm/Object/MachO.h @@ -346,8 +346,8 @@ public: getSegmentLoadCommand(const LoadCommandInfo &L) const; MachO::segment_command_64 getSegment64LoadCommand(const LoadCommandInfo &L) const; - MachO::linker_options_command - getLinkerOptionsLoadCommand(const LoadCommandInfo &L) const; + MachO::linker_option_command + getLinkerOptionLoadCommand(const LoadCommandInfo &L) const; MachO::version_min_command getVersionMinLoadCommand(const LoadCommandInfo &L) const; MachO::dylib_command diff --git a/llvm/include/llvm/Support/MachO.h b/llvm/include/llvm/Support/MachO.h index 2ccf824..342bdd5 100644 --- a/llvm/include/llvm/Support/MachO.h +++ b/llvm/include/llvm/Support/MachO.h @@ -131,7 +131,7 @@ namespace llvm { LC_SOURCE_VERSION = 0x0000002Au, LC_DYLIB_CODE_SIGN_DRS = 0x0000002Bu, LC_ENCRYPTION_INFO_64 = 0x0000002Cu, - LC_LINKER_OPTIONS = 0x0000002Du, + LC_LINKER_OPTION = 0x0000002Du, LC_LINKER_OPTIMIZATION_HINT = 0x0000002Eu }; @@ -874,7 +874,7 @@ namespace llvm { uint32_t export_size; }; - struct linker_options_command { + struct linker_option_command { uint32_t cmd; uint32_t cmdsize; uint32_t count; @@ -1206,7 +1206,7 @@ namespace llvm { sys::swapByteOrder(C.datasize); } - inline void swapStruct(linker_options_command &C) { + inline void swapStruct(linker_option_command &C) { sys::swapByteOrder(C.cmd); sys::swapByteOrder(C.cmdsize); sys::swapByteOrder(C.count); diff --git a/llvm/lib/MC/MachObjectWriter.cpp b/llvm/lib/MC/MachObjectWriter.cpp index 577c4b7..d3751bd 100644 --- a/llvm/lib/MC/MachObjectWriter.cpp +++ b/llvm/lib/MC/MachObjectWriter.cpp @@ -418,7 +418,7 @@ void MachObjectWriter::WriteLinkeditLoadCommand(uint32_t Type, static unsigned ComputeLinkerOptionsLoadCommandSize( const std::vector &Options, bool is64Bit) { - unsigned Size = sizeof(MachO::linker_options_command); + unsigned Size = sizeof(MachO::linker_option_command); for (unsigned i = 0, e = Options.size(); i != e; ++i) Size += Options[i].size() + 1; return RoundUpToAlignment(Size, is64Bit ? 8 : 4); @@ -431,10 +431,10 @@ void MachObjectWriter::WriteLinkerOptionsLoadCommand( uint64_t Start = OS.tell(); (void) Start; - Write32(MachO::LC_LINKER_OPTIONS); + Write32(MachO::LC_LINKER_OPTION); Write32(Size); Write32(Options.size()); - uint64_t BytesWritten = sizeof(MachO::linker_options_command); + uint64_t BytesWritten = sizeof(MachO::linker_option_command); for (unsigned i = 0, e = Options.size(); i != e; ++i) { // Write each string, including the null byte. const std::string &Option = Options[i]; diff --git a/llvm/lib/Object/MachOObjectFile.cpp b/llvm/lib/Object/MachOObjectFile.cpp index 0e96bc7..5bc1110 100644 --- a/llvm/lib/Object/MachOObjectFile.cpp +++ b/llvm/lib/Object/MachOObjectFile.cpp @@ -2254,9 +2254,9 @@ MachOObjectFile::getSegment64LoadCommand(const LoadCommandInfo &L) const { return getStruct(this, L.Ptr); } -MachO::linker_options_command -MachOObjectFile::getLinkerOptionsLoadCommand(const LoadCommandInfo &L) const { - return getStruct(this, L.Ptr); +MachO::linker_option_command +MachOObjectFile::getLinkerOptionLoadCommand(const LoadCommandInfo &L) const { + return getStruct(this, L.Ptr); } MachO::version_min_command diff --git a/llvm/test/tools/llvm-objdump/X86/Inputs/linkerOption.macho-x86_64 b/llvm/test/tools/llvm-objdump/X86/Inputs/linkerOption.macho-x86_64 new file mode 100644 index 0000000000000000000000000000000000000000..38053c5ce9a6f979a18535d55b2d43aa0f66efe2 GIT binary patch literal 744 zcma)4u}Z^G6n&}1cBnOogMvc_5v5dgb5yjYgOgO~pguyH(xOeIq_j9WiEbVJ3`chd z-TVqi!BIribMkI%ItU&(IrrRqd-L9Hoiz#_Os{|APWf0LfX zW2PcGm(V)$hmnbmuU8uNu}`8o2{e4+fo}srCMzlwxU!aYSpFLtI1U>XI>e8lK@60eA2Ob)YMt4UXXR z&^7VwBg!Cu$C>3buT+8(%&&rME64X9guPQ$4f{dUjXGg~{C{v*yLq{1<74HMa{Mrg zF;4?n7YE83+Lm3&z|EQg!eU;gr;rEh;)MX{(%906>s3;a3qbF3{ usR;R1iB%B=?t&@rMqq?*~<@Jl}POX literal 0 HcmV?d00001 diff --git a/llvm/test/tools/llvm-objdump/X86/macho-private-headers.test b/llvm/test/tools/llvm-objdump/X86/macho-private-headers.test index 685b4f7..2bbd340 100644 --- a/llvm/test/tools/llvm-objdump/X86/macho-private-headers.test +++ b/llvm/test/tools/llvm-objdump/X86/macho-private-headers.test @@ -3,6 +3,8 @@ // RUN: | FileCheck %s -check-prefix=EXE // RUN: llvm-objdump -p %p/Inputs/dylibLoadKinds.macho-x86_64 \ // RUN: | FileCheck %s -check-prefix=LOAD +// RUN: llvm-objdump -p %p/Inputs/linkerOption.macho-x86_64 \ +// RUN: | FileCheck %s -check-prefix=LD_OPT CHECK: Mach header CHECK: magic cputype cpusubtype caps filetype ncmds sizeofcmds flags @@ -366,3 +368,14 @@ LOAD: name /usr/lib/foo4.dylib (offset 24) LOAD: current version 0.0.0 LOAD: compatibility version 0.0.0 +LD_OPT: Load command 4 +LD_OPT: cmd LC_LINKER_OPTION +LD_OPT: cmdsize 24 +LD_OPT: count 1 +LD_OPT: string #1 -lc++ +LD_OPT: Load command 5 +LD_OPT: cmd LC_LINKER_OPTION +LD_OPT: cmdsize 40 +LD_OPT: count 2 +LD_OPT: string #1 -framework +LD_OPT: string #2 Foundation diff --git a/llvm/tools/llvm-objdump/MachODump.cpp b/llvm/tools/llvm-objdump/MachODump.cpp index 580b036..7446e32 100644 --- a/llvm/tools/llvm-objdump/MachODump.cpp +++ b/llvm/tools/llvm-objdump/MachODump.cpp @@ -3644,6 +3644,36 @@ static void PrintEncryptionInfoCommand64(MachO::encryption_info_command_64 ec, outs() << " pad " << ec.pad << "\n"; } +static void PrintLinkerOptionCommand(MachO::linker_option_command lo, + const char *Ptr) { + outs() << " cmd LC_LINKER_OPTION\n"; + outs() << " cmdsize " << lo.cmdsize; + if (lo.cmdsize < sizeof(struct MachO::linker_option_command)) + outs() << " Incorrect size\n"; + else + outs() << "\n"; + outs() << " count " << lo.count << "\n"; + const char *string = Ptr + sizeof(struct MachO::linker_option_command); + uint32_t left = lo.cmdsize - sizeof(struct MachO::linker_option_command); + uint32_t i = 0; + while (left > 0) { + while (*string == '\0' && left > 0) { + string++; + left--; + } + if (left > 0) { + i++; + outs() << " string #" << i << " " << format("%.*s\n", left, string); + uint32_t len = strnlen(string, left) + 1; + string += len; + left -= len; + } + } + if (lo.count != i) + outs() << " count " << lo.count << " does not match number of strings " << i + << "\n"; +} + static void PrintDylibCommand(MachO::dylib_command dl, const char *Ptr) { if (dl.cmd == MachO::LC_ID_DYLIB) outs() << " cmd LC_ID_DYLIB\n"; @@ -3797,6 +3827,9 @@ static void PrintLoadCommands(const MachOObjectFile *Obj, uint32_t ncmds, } else if (Command.C.cmd == MachO::LC_ENCRYPTION_INFO_64) { MachO::encryption_info_command_64 Ei = Obj->getEncryptionInfoCommand64(Command); PrintEncryptionInfoCommand64(Ei, Buf.size()); + } else if (Command.C.cmd == MachO::LC_LINKER_OPTION) { + MachO::linker_option_command Lo = Obj->getLinkerOptionLoadCommand(Command); + PrintLinkerOptionCommand(Lo, Command.Ptr); } else if (Command.C.cmd == MachO::LC_LOAD_DYLIB || Command.C.cmd == MachO::LC_ID_DYLIB || Command.C.cmd == MachO::LC_LOAD_WEAK_DYLIB || diff --git a/llvm/tools/macho-dump/macho-dump.cpp b/llvm/tools/macho-dump/macho-dump.cpp index aac720d..604f93ad 100644 --- a/llvm/tools/macho-dump/macho-dump.cpp +++ b/llvm/tools/macho-dump/macho-dump.cpp @@ -300,12 +300,12 @@ DumpDataInCodeDataCommand(const MachOObjectFile &Obj, static int DumpLinkerOptionsCommand(const MachOObjectFile &Obj, const MachOObjectFile::LoadCommandInfo &LCI) { - MachO::linker_options_command LOLC = Obj.getLinkerOptionsLoadCommand(LCI); + MachO::linker_option_command LOLC = Obj.getLinkerOptionLoadCommand(LCI); outs() << " ('count', " << LOLC.count << ")\n" << " ('_strings', [\n"; - uint64_t DataSize = LOLC.cmdsize - sizeof(MachO::linker_options_command); - const char *P = LCI.Ptr + sizeof(MachO::linker_options_command); + uint64_t DataSize = LOLC.cmdsize - sizeof(MachO::linker_option_command); + const char *P = LCI.Ptr + sizeof(MachO::linker_option_command); StringRef Data(P, DataSize); for (unsigned i = 0; i != LOLC.count; ++i) { std::pair Split = Data.split('\0'); @@ -356,7 +356,7 @@ static int DumpLoadCommand(const MachOObjectFile &Obj, return DumpLinkeditDataCommand(Obj, LCI); case MachO::LC_DATA_IN_CODE: return DumpDataInCodeDataCommand(Obj, LCI); - case MachO::LC_LINKER_OPTIONS: + case MachO::LC_LINKER_OPTION: return DumpLinkerOptionsCommand(Obj, LCI); case MachO::LC_VERSION_MIN_IPHONEOS: case MachO::LC_VERSION_MIN_MACOSX: -- 2.7.4