1255bbe93ed7aef5418000339b6cdb5677bf9e4d6ted.mielczarek// Copyright (c) 2006, Google Inc. 2255bbe93ed7aef5418000339b6cdb5677bf9e4d6ted.mielczarek// All rights reserved. 3255bbe93ed7aef5418000339b6cdb5677bf9e4d6ted.mielczarek// 4255bbe93ed7aef5418000339b6cdb5677bf9e4d6ted.mielczarek// Redistribution and use in source and binary forms, with or without 5255bbe93ed7aef5418000339b6cdb5677bf9e4d6ted.mielczarek// modification, are permitted provided that the following conditions are 6255bbe93ed7aef5418000339b6cdb5677bf9e4d6ted.mielczarek// met: 7255bbe93ed7aef5418000339b6cdb5677bf9e4d6ted.mielczarek// 8255bbe93ed7aef5418000339b6cdb5677bf9e4d6ted.mielczarek// * Redistributions of source code must retain the above copyright 9255bbe93ed7aef5418000339b6cdb5677bf9e4d6ted.mielczarek// notice, this list of conditions and the following disclaimer. 10255bbe93ed7aef5418000339b6cdb5677bf9e4d6ted.mielczarek// * Redistributions in binary form must reproduce the above 11255bbe93ed7aef5418000339b6cdb5677bf9e4d6ted.mielczarek// copyright notice, this list of conditions and the following disclaimer 12255bbe93ed7aef5418000339b6cdb5677bf9e4d6ted.mielczarek// in the documentation and/or other materials provided with the 13255bbe93ed7aef5418000339b6cdb5677bf9e4d6ted.mielczarek// distribution. 14255bbe93ed7aef5418000339b6cdb5677bf9e4d6ted.mielczarek// * Neither the name of Google Inc. nor the names of its 15255bbe93ed7aef5418000339b6cdb5677bf9e4d6ted.mielczarek// contributors may be used to endorse or promote products derived from 16255bbe93ed7aef5418000339b6cdb5677bf9e4d6ted.mielczarek// this software without specific prior written permission. 17255bbe93ed7aef5418000339b6cdb5677bf9e4d6ted.mielczarek// 18255bbe93ed7aef5418000339b6cdb5677bf9e4d6ted.mielczarek// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19255bbe93ed7aef5418000339b6cdb5677bf9e4d6ted.mielczarek// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20255bbe93ed7aef5418000339b6cdb5677bf9e4d6ted.mielczarek// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21255bbe93ed7aef5418000339b6cdb5677bf9e4d6ted.mielczarek// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22255bbe93ed7aef5418000339b6cdb5677bf9e4d6ted.mielczarek// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23255bbe93ed7aef5418000339b6cdb5677bf9e4d6ted.mielczarek// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24255bbe93ed7aef5418000339b6cdb5677bf9e4d6ted.mielczarek// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25255bbe93ed7aef5418000339b6cdb5677bf9e4d6ted.mielczarek// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26255bbe93ed7aef5418000339b6cdb5677bf9e4d6ted.mielczarek// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27255bbe93ed7aef5418000339b6cdb5677bf9e4d6ted.mielczarek// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28255bbe93ed7aef5418000339b6cdb5677bf9e4d6ted.mielczarek// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29255bbe93ed7aef5418000339b6cdb5677bf9e4d6ted.mielczarek 30255bbe93ed7aef5418000339b6cdb5677bf9e4d6ted.mielczarek// macho_utilties.cc: Utilities for dealing with mach-o files 31255bbe93ed7aef5418000339b6cdb5677bf9e4d6ted.mielczarek// 32255bbe93ed7aef5418000339b6cdb5677bf9e4d6ted.mielczarek// Author: Dave Camp 33255bbe93ed7aef5418000339b6cdb5677bf9e4d6ted.mielczarek 3452a508dfe205d2c9c21171a33d630c4e314e1255jimblandy#include "common/mac/byteswap.h" 35255bbe93ed7aef5418000339b6cdb5677bf9e4d6ted.mielczarek#include "common/mac/macho_utilities.h" 36255bbe93ed7aef5418000339b6cdb5677bf9e4d6ted.mielczarek 37255bbe93ed7aef5418000339b6cdb5677bf9e4d6ted.mielczarekvoid breakpad_swap_uuid_command(struct breakpad_uuid_command *uc, 38255bbe93ed7aef5418000339b6cdb5677bf9e4d6ted.mielczarek enum NXByteOrder target_byte_order) 39255bbe93ed7aef5418000339b6cdb5677bf9e4d6ted.mielczarek{ 4052a508dfe205d2c9c21171a33d630c4e314e1255jimblandy uc->cmd = ByteSwap(uc->cmd); 4152a508dfe205d2c9c21171a33d630c4e314e1255jimblandy uc->cmdsize = ByteSwap(uc->cmdsize); 42255bbe93ed7aef5418000339b6cdb5677bf9e4d6ted.mielczarek} 43255bbe93ed7aef5418000339b6cdb5677bf9e4d6ted.mielczarek 44255bbe93ed7aef5418000339b6cdb5677bf9e4d6ted.mielczarekvoid breakpad_swap_segment_command_64(struct segment_command_64 *sg, 45255bbe93ed7aef5418000339b6cdb5677bf9e4d6ted.mielczarek enum NXByteOrder target_byte_order) 46255bbe93ed7aef5418000339b6cdb5677bf9e4d6ted.mielczarek{ 4752a508dfe205d2c9c21171a33d630c4e314e1255jimblandy sg->cmd = ByteSwap(sg->cmd); 4852a508dfe205d2c9c21171a33d630c4e314e1255jimblandy sg->cmdsize = ByteSwap(sg->cmdsize); 49255bbe93ed7aef5418000339b6cdb5677bf9e4d6ted.mielczarek 5052a508dfe205d2c9c21171a33d630c4e314e1255jimblandy sg->vmaddr = ByteSwap(sg->vmaddr); 5152a508dfe205d2c9c21171a33d630c4e314e1255jimblandy sg->vmsize = ByteSwap(sg->vmsize); 5252a508dfe205d2c9c21171a33d630c4e314e1255jimblandy sg->fileoff = ByteSwap(sg->fileoff); 5352a508dfe205d2c9c21171a33d630c4e314e1255jimblandy sg->filesize = ByteSwap(sg->filesize); 54255bbe93ed7aef5418000339b6cdb5677bf9e4d6ted.mielczarek 5552a508dfe205d2c9c21171a33d630c4e314e1255jimblandy sg->maxprot = ByteSwap(sg->maxprot); 5652a508dfe205d2c9c21171a33d630c4e314e1255jimblandy sg->initprot = ByteSwap(sg->initprot); 5752a508dfe205d2c9c21171a33d630c4e314e1255jimblandy sg->nsects = ByteSwap(sg->nsects); 5852a508dfe205d2c9c21171a33d630c4e314e1255jimblandy sg->flags = ByteSwap(sg->flags); 59255bbe93ed7aef5418000339b6cdb5677bf9e4d6ted.mielczarek} 60255bbe93ed7aef5418000339b6cdb5677bf9e4d6ted.mielczarek 61255bbe93ed7aef5418000339b6cdb5677bf9e4d6ted.mielczarekvoid breakpad_swap_mach_header_64(struct mach_header_64 *mh, 62255bbe93ed7aef5418000339b6cdb5677bf9e4d6ted.mielczarek enum NXByteOrder target_byte_order) 63255bbe93ed7aef5418000339b6cdb5677bf9e4d6ted.mielczarek{ 6452a508dfe205d2c9c21171a33d630c4e314e1255jimblandy mh->magic = ByteSwap(mh->magic); 6552a508dfe205d2c9c21171a33d630c4e314e1255jimblandy mh->cputype = ByteSwap(mh->cputype); 6652a508dfe205d2c9c21171a33d630c4e314e1255jimblandy mh->cpusubtype = ByteSwap(mh->cpusubtype); 6752a508dfe205d2c9c21171a33d630c4e314e1255jimblandy mh->filetype = ByteSwap(mh->filetype); 6852a508dfe205d2c9c21171a33d630c4e314e1255jimblandy mh->ncmds = ByteSwap(mh->ncmds); 6952a508dfe205d2c9c21171a33d630c4e314e1255jimblandy mh->sizeofcmds = ByteSwap(mh->sizeofcmds); 7052a508dfe205d2c9c21171a33d630c4e314e1255jimblandy mh->flags = ByteSwap(mh->flags); 7152a508dfe205d2c9c21171a33d630c4e314e1255jimblandy mh->reserved = ByteSwap(mh->reserved); 72255bbe93ed7aef5418000339b6cdb5677bf9e4d6ted.mielczarek} 73255bbe93ed7aef5418000339b6cdb5677bf9e4d6ted.mielczarek 74255bbe93ed7aef5418000339b6cdb5677bf9e4d6ted.mielczarekvoid breakpad_swap_section_64(struct section_64 *s, 75255bbe93ed7aef5418000339b6cdb5677bf9e4d6ted.mielczarek uint32_t nsects, 76255bbe93ed7aef5418000339b6cdb5677bf9e4d6ted.mielczarek enum NXByteOrder target_byte_order) 77255bbe93ed7aef5418000339b6cdb5677bf9e4d6ted.mielczarek{ 78255bbe93ed7aef5418000339b6cdb5677bf9e4d6ted.mielczarek for (uint32_t i = 0; i < nsects; i++) { 7952a508dfe205d2c9c21171a33d630c4e314e1255jimblandy s[i].addr = ByteSwap(s[i].addr); 8052a508dfe205d2c9c21171a33d630c4e314e1255jimblandy s[i].size = ByteSwap(s[i].size); 81255bbe93ed7aef5418000339b6cdb5677bf9e4d6ted.mielczarek 8252a508dfe205d2c9c21171a33d630c4e314e1255jimblandy s[i].offset = ByteSwap(s[i].offset); 8352a508dfe205d2c9c21171a33d630c4e314e1255jimblandy s[i].align = ByteSwap(s[i].align); 8452a508dfe205d2c9c21171a33d630c4e314e1255jimblandy s[i].reloff = ByteSwap(s[i].reloff); 8552a508dfe205d2c9c21171a33d630c4e314e1255jimblandy s[i].nreloc = ByteSwap(s[i].nreloc); 8652a508dfe205d2c9c21171a33d630c4e314e1255jimblandy s[i].flags = ByteSwap(s[i].flags); 8752a508dfe205d2c9c21171a33d630c4e314e1255jimblandy s[i].reserved1 = ByteSwap(s[i].reserved1); 8852a508dfe205d2c9c21171a33d630c4e314e1255jimblandy s[i].reserved2 = ByteSwap(s[i].reserved2); 89255bbe93ed7aef5418000339b6cdb5677bf9e4d6ted.mielczarek } 90255bbe93ed7aef5418000339b6cdb5677bf9e4d6ted.mielczarek} 91