@@ -43,20 +43,20 @@ struct MachOBuilderLoadCommandBase {
43
43
};
44
44
45
45
// / MachOBuilder load command wrapper type.
46
- template <MachO::LoadCommandType LCType> struct MachOBuilderLoadCommand ;
46
+ template <MachO::LoadCommandType LCType> struct MachOBuilderLoadCommandImplBase ;
47
47
48
48
#define HANDLE_LOAD_COMMAND (Name, Value, LCStruct ) \
49
49
template <> \
50
- struct MachOBuilderLoadCommand <MachO::Name> \
50
+ struct MachOBuilderLoadCommandImplBase <MachO::Name> \
51
51
: public MachO::LCStruct, public MachOBuilderLoadCommandBase { \
52
52
using CmdStruct = LCStruct; \
53
- MachOBuilderLoadCommand () { \
53
+ MachOBuilderLoadCommandImplBase () { \
54
54
memset (&rawStruct (), 0 , sizeof (CmdStruct)); \
55
55
cmd = Value; \
56
56
cmdsize = sizeof (CmdStruct); \
57
57
} \
58
58
template <typename ... ArgTs> \
59
- MachOBuilderLoadCommand (ArgTs &&...Args) \
59
+ MachOBuilderLoadCommandImplBase (ArgTs &&...Args) \
60
60
: CmdStruct{Value, sizeof (CmdStruct), std::forward<ArgTs>(Args)...} {} \
61
61
CmdStruct &rawStruct () { return static_cast <CmdStruct &>(*this ); } \
62
62
size_t size () const override { return cmdsize; } \
@@ -70,6 +70,40 @@ template <MachO::LoadCommandType LCType> struct MachOBuilderLoadCommand;
70
70
71
71
#undef HANDLE_LOAD_COMMAND
72
72
73
+ template <MachO::LoadCommandType LCType>
74
+ struct MachOBuilderLoadCommand
75
+ : public MachOBuilderLoadCommandImplBase<LCType> {
76
+ public:
77
+ MachOBuilderLoadCommand () = default ;
78
+
79
+ template <typename ... ArgTs>
80
+ MachOBuilderLoadCommand (ArgTs &&...Args)
81
+ : MachOBuilderLoadCommand(std::forward<ArgTs>(Args)...) {}
82
+ };
83
+
84
+ template <>
85
+ struct MachOBuilderLoadCommand <MachO::LC_ID_DYLIB>
86
+ : public MachOBuilderLoadCommandImplBase<MachO::LC_ID_DYLIB> {
87
+
88
+ MachOBuilderLoadCommand (std::string Name, uint32_t Timestamp,
89
+ uint32_t CurrentVersion,
90
+ uint32_t CompatibilityVersion)
91
+ : MachOBuilderLoadCommandImplBase(
92
+ MachO::dylib{24 , Timestamp, CurrentVersion, CompatibilityVersion}),
93
+ Name (std::move(Name)) {
94
+ cmdsize += (this ->Name .size () + 1 + 3 ) & ~0x3 ;
95
+ }
96
+
97
+ size_t write (MutableArrayRef<char > Buf, size_t Offset,
98
+ bool SwapStruct) override {
99
+ Offset = writeMachOStruct (Buf, Offset, rawStruct (), SwapStruct);
100
+ strcpy (Buf.data () + Offset, Name.data ());
101
+ return Offset + ((Name.size () + 1 + 3 ) & ~0x3 );
102
+ }
103
+
104
+ std::string Name;
105
+ };
106
+
73
107
// Builds MachO objects.
74
108
template <typename MachOTraits> class MachOBuilder {
75
109
private:
0 commit comments