authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2024-02-25 14:03:23+01:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2024-02-26 02:22:36+01:00
log2901026425172be1f03c6eed544e8fabbdada4e0
treea612ced0761c786ae19c7053a675584b8cd36c0a
parentd7276c1527a298ba8647f312d5e86615bbc99eda

macho: fix section to segment mapping


1 files changed, 15 insertions(+), 14 deletions(-)

src/link/MachO/Atom.zig+15-14
...@@ -119,12 +119,9 @@ pub fn getThunk(self: Atom, macho_file: *MachO) *Thunk {...@@ -119,12 +119,9 @@ pub fn getThunk(self: Atom, macho_file: *MachO) *Thunk {
119119
120pub fn initOutputSection(sect: macho.section_64, macho_file: *MachO) !u8 {120pub fn initOutputSection(sect: macho.section_64, macho_file: *MachO) !u8 {
121 const segname, const sectname, const flags = blk: {121 const segname, const sectname, const flags = blk: {
122 const segname = sect.segName();
123 const sectname = sect.sectName();
124
125 if (sect.isCode()) break :blk .{122 if (sect.isCode()) break :blk .{
126 "__TEXT",123 "__TEXT",
127 sectname,124 "__text",
128 macho.S_REGULAR | macho.S_ATTR_PURE_INSTRUCTIONS | macho.S_ATTR_SOME_INSTRUCTIONS,125 macho.S_REGULAR | macho.S_ATTR_PURE_INSTRUCTIONS | macho.S_ATTR_SOME_INSTRUCTIONS,
129 };126 };
130127
...@@ -135,32 +132,36 @@ pub fn initOutputSection(sect: macho.section_64, macho_file: *MachO) !u8 {...@@ -135,32 +132,36 @@ pub fn initOutputSection(sect: macho.section_64, macho_file: *MachO) !u8 {
135 => break :blk .{ "__TEXT", "__const", macho.S_REGULAR },132 => break :blk .{ "__TEXT", "__const", macho.S_REGULAR },
136133
137 macho.S_CSTRING_LITERALS => {134 macho.S_CSTRING_LITERALS => {
138 if (mem.startsWith(u8, sectname, "__objc")) break :blk .{135 if (mem.startsWith(u8, sect.sectName(), "__objc")) break :blk .{
139 segname, sectname, macho.S_REGULAR,136 sect.segName(), sect.sectName(), macho.S_REGULAR,
140 };137 };
141 break :blk .{ "__TEXT", "__cstring", macho.S_CSTRING_LITERALS };138 break :blk .{ "__TEXT", "__cstring", macho.S_CSTRING_LITERALS };
142 },139 },
143140
144 macho.S_MOD_INIT_FUNC_POINTERS,141 macho.S_MOD_INIT_FUNC_POINTERS,
145 macho.S_MOD_TERM_FUNC_POINTERS,142 macho.S_MOD_TERM_FUNC_POINTERS,
146 macho.S_LITERAL_POINTERS,143 => break :blk .{ "__DATA_CONST", sect.sectName(), sect.flags },
147 => break :blk .{ "__DATA_CONST", sectname, sect.flags },
148144
145 macho.S_LITERAL_POINTERS,
149 macho.S_ZEROFILL,146 macho.S_ZEROFILL,
150 macho.S_GB_ZEROFILL,147 macho.S_GB_ZEROFILL,
151 macho.S_THREAD_LOCAL_VARIABLES,148 macho.S_THREAD_LOCAL_VARIABLES,
152 macho.S_THREAD_LOCAL_VARIABLE_POINTERS,149 macho.S_THREAD_LOCAL_VARIABLE_POINTERS,
153 macho.S_THREAD_LOCAL_REGULAR,150 macho.S_THREAD_LOCAL_REGULAR,
154 macho.S_THREAD_LOCAL_ZEROFILL,151 macho.S_THREAD_LOCAL_ZEROFILL,
155 => break :blk .{ "__DATA", sectname, sect.flags },152 => break :blk .{ sect.segName(), sect.sectName(), sect.flags },
156153
157 // TODO: do we need this check here?154 macho.S_COALESCED => break :blk .{
158 macho.S_COALESCED => break :blk .{ segname, sectname, macho.S_REGULAR },155 sect.segName(),
156 sect.sectName(),
157 macho.S_REGULAR,
158 },
159159
160 macho.S_REGULAR => {160 macho.S_REGULAR => {
161 const segname = sect.segName();
162 const sectname = sect.sectName();
161 if (mem.eql(u8, segname, "__DATA")) {163 if (mem.eql(u8, segname, "__DATA")) {
162 if (mem.eql(u8, sectname, "__const") or164 if (mem.eql(u8, sectname, "__cfstring") or
163 mem.eql(u8, sectname, "__cfstring") or
164 mem.eql(u8, sectname, "__objc_classlist") or165 mem.eql(u8, sectname, "__objc_classlist") or
165 mem.eql(u8, sectname, "__objc_imageinfo")) break :blk .{166 mem.eql(u8, sectname, "__objc_imageinfo")) break :blk .{
166 "__DATA_CONST",167 "__DATA_CONST",
...@@ -171,7 +172,7 @@ pub fn initOutputSection(sect: macho.section_64, macho_file: *MachO) !u8 {...@@ -171,7 +172,7 @@ pub fn initOutputSection(sect: macho.section_64, macho_file: *MachO) !u8 {
171 break :blk .{ segname, sectname, sect.flags };172 break :blk .{ segname, sectname, sect.flags };
172 },173 },
173174
174 else => break :blk .{ segname, sectname, sect.flags },175 else => break :blk .{ sect.segName(), sect.sectName(), sect.flags },
175 }176 }
176 };177 };
177 const osec = macho_file.getSectionByName(segname, sectname) orelse try macho_file.addSection(178 const osec = macho_file.getSectionByName(segname, sectname) orelse try macho_file.addSection(