Difference between revisions of "Mach-O"

From Lazarus wiki
Jump to navigationJump to search
Line 40: Line 40:
 
=== __image_info ===
 
=== __image_info ===
 
   
 
   
The section contents image info information (8 bytes):
+
The section contents only image info information:
  
 
  imageInfo = packed record
 
  imageInfo = packed record

Revision as of 10:15, 28 August 2009

from Wikipedia:

Mach-O, short for Mach object file format, is a file format for executables, object code, shared libraries, dynamically-loaded code, and core dumps. A derivation of the a.out format, Mach-O offered more extensibility and faster access to information in the symbol table.


File Format Reference can be found here


Following tools are used in Mac OS X to view Mach-O files:

otool - object file displaying tool

nm - display name list (symbol table)

Objective-C segment

There're no documentation found over __OBJC segment and its sections. The following information has been gathered from cctools sources

Structures strings

Some structures in sections are containing name pointers. This names are stored in c-strings section (segment: __TEXT; section: __cstring). File offset for the string name can be evaluated in the following way:

string_file_offset := cstr_section.offset + (name_addr - cstr_section.addr);

Sections

__module_info

(objc_module record is declared at objc headers)

objc_module = packed record
  version : culong; // version number = 7 
  size    : culong; // sizeof(objc_module)?
  name    : PChar;  // virtual memory address of the module name.
  _symtab : Symtab;
end;

__image_info

The section contents only image info information:

imageInfo = packed record
  version : uint32_t;
  flags   : uint32_t;
end;

Flags values:

F_and_C = $01;
GC      = $02;
GC_only = $04;

Mach-O additional 30Kb size

FPC built mach-o executables are somehow larger, comparing to win target, for example

begin
  writeln('hello world');
end.

gives a 30k (stripped) executable for Win, and 60k for Mac OS X.


Jonas Maebe: It's because there was a bug in older versions of the Darwin linker that required adding ".reference" assembler directives for routines that have more than one assembler name (most of the compiler helpers in the rtl have that). This fixed the problem, but as a result they are never smart linked out. It's only a fixed overhead of that 30kb (most programs don't contain any extra routines with multiple assembler names)