]> git.saurik.com Git - apple/ld64.git/commitdiff
ld64-95.8.4.tar.gz iphone-30 v95.8.4
authorApple <opensource@apple.com>
Tue, 16 Jun 2009 01:58:03 +0000 (01:58 +0000)
committerApple <opensource@apple.com>
Tue, 16 Jun 2009 01:58:03 +0000 (01:58 +0000)
59 files changed:
ChangeLog
doc/man/man1/ld.1
src/ld/Architectures.hpp
src/ld/LTOReader.hpp
src/ld/MachOReaderDylib.hpp
src/ld/MachOReaderRelocatable.hpp
src/ld/MachOWriterExecutable.hpp
src/ld/ObjectFile.h
src/ld/Options.cpp
src/ld/ld.cpp
src/other/dyldinfo.cpp
src/other/unwinddump.cpp
unit-tests/run-all-unit-tests
unit-tests/test-cases/coalesce_weak_def_in_dylib/Makefile [deleted file]
unit-tests/test-cases/coalesce_weak_def_in_dylib/foo.c [deleted file]
unit-tests/test-cases/coalesce_weak_def_in_dylib/main.c [deleted file]
unit-tests/test-cases/cstring-alt-segment/Makefile [deleted file]
unit-tests/test-cases/cstring-alt-segment/custom.s [deleted file]
unit-tests/test-cases/cstring-alt-segment/main.c [deleted file]
unit-tests/test-cases/cstring-labels/foo.c
unit-tests/test-cases/dead_strip-r_symbol_desc/Makefile [deleted file]
unit-tests/test-cases/dead_strip-r_symbol_desc/main.c [deleted file]
unit-tests/test-cases/dead_strip-weak-coalesce/Makefile [deleted file]
unit-tests/test-cases/dead_strip-weak-coalesce/baz.c [deleted file]
unit-tests/test-cases/dead_strip-weak-coalesce/foo.c [deleted file]
unit-tests/test-cases/dead_strip-weak-coalesce/main.c [deleted file]
unit-tests/test-cases/eh-coalescing-no-labels/Makefile
unit-tests/test-cases/init-order/Makefile
unit-tests/test-cases/init-order/expected-order.txt
unit-tests/test-cases/kext-basic/Makefile
unit-tests/test-cases/label-on-end-of-section/Makefile [new file with mode: 0644]
unit-tests/test-cases/label-on-end-of-section/foo.s [new file with mode: 0644]
unit-tests/test-cases/no-data-bundle/Makefile [deleted file]
unit-tests/test-cases/no-data-bundle/foo.c [deleted file]
unit-tests/test-cases/no_zero_fill_sections/Makefile [new file with mode: 0644]
unit-tests/test-cases/no_zero_fill_sections/main.c [new file with mode: 0644]
unit-tests/test-cases/objc-literal-pointers-strip/Makefile [deleted file]
unit-tests/test-cases/objc-literal-pointers-strip/test.m [deleted file]
unit-tests/test-cases/operator-new/Makefile
unit-tests/test-cases/operator-new/main.cxx
unit-tests/test-cases/re-export-optimizations-indirect/Makefile [deleted file]
unit-tests/test-cases/re-export-optimizations-indirect/bar.c [deleted file]
unit-tests/test-cases/re-export-optimizations-indirect/foo.c [deleted file]
unit-tests/test-cases/re-export-optimizations-indirect/main.c [deleted file]
unit-tests/test-cases/re-export-optimizations-indirect/middle.c [deleted file]
unit-tests/test-cases/re-export-optimizations-indirect/other.c [deleted file]
unit-tests/test-cases/relocs-neg-from-local/Makefile [deleted file]
unit-tests/test-cases/relocs-neg-from-local/test.s [deleted file]
unit-tests/test-cases/section-labels/Makefile [new file with mode: 0644]
unit-tests/test-cases/section-labels/main.c [new file with mode: 0644]
unit-tests/test-cases/section-names-long/Makefile [deleted file]
unit-tests/test-cases/section-names-long/a.s [deleted file]
unit-tests/test-cases/section-names-long/b.s [deleted file]
unit-tests/test-cases/section-names-long/c.s [deleted file]
unit-tests/test-cases/section-names-long/main.c [deleted file]
unit-tests/test-cases/shared-cache-dylib/Makefile [deleted file]
unit-tests/test-cases/shared-cache-dylib/foo.c [deleted file]
unit-tests/test-cases/stripped-indirect-symbol-table/Makefile
unit-tests/test-cases/weak_import/Makefile

index 79dcc59fe645223c92ca61590e3d8f1ee34e4360..ab1e984cf3a979147f61ceef4af6512f01a518f0 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
 
 
------ Tagged ld64-95.2.12
+----- Tagged ld64-95.9
 
 
-2009-07-02    Nick Kledzik    <kledzik@apple.com>
+2009-02-13     Nick Kledzik    <kledzik@apple.com>
 
 
-       <rdar://problem/6836647> creation of __unwind_info section can fail if hundreds of functions cannot be compact encoded
+       <rdar://problem/6543423> Back out Linker changes for H2 hang
+       * src/ld/Options.cpp: remove fPreventPageCrossingBranches
+       * src/ld/MachOWriterExecutable.hpp: remove layout of __text so there are not page crossing branches
+       * src/ld/MachOReaderRelocatable.hpp: parse but ignore ARM_THUMB_32BIT_BRANCH reloc
 
 
 
 
------ Tagged ld64-95.2.11
+----- Tagged ld64-95.8.3
 
 
-2009-06-19    Nick Kledzik    <kledzik@apple.com>
+2009-03-31     Nick Kledzik    <kledzik@apple.com>
 
 
-       <rdar://problem/6960981> Link Time Optimization errors out when targeting < 10.6
-
-
------ Tagged ld64-95.2.10
-
-2009-04-02    Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/6805002> corrupt metaclass entry in dynamic library
-       * src/ld/ld.cpp: change Section constructor to copy segment and section names
-
-
------ Tagged ld64-95.2.9
-
-2009-04-02    Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/6744267> Update ld64 for new triples introduced in 6654669 to support ARM LLVM
-       * src/ld/LTOReader.hpp: change "arm-" to "arm" so matching works for new triples
-
-
------ Tagged ld64-95.2.8
-
-2009-03-24    Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/6713931> anonymous functions have the compact unwind info computed wrong
-       * ld/MachOReaderRelocatable.hpp: use new compact unwind function in AnonymousAtom
-
-
------ Tagged ld64-95.2.7
-
-2009-03-11    Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/6670421> AddressBook incorrectly gets _objc_msgSend from WebKit
-       * src/ld/MachOReaderDylib.hpp: fix processIndirectLibraries() to not force a private re-export of a dylib
-                                                                       that is already explictly or implicitly linked.
-       * unit-tests/test-cases/re-export-optimizations-indirect: add test case
+       <rdar://problem/6719270> ld might set MH_WEAK_DEFINES when it should not
+       * src/ld/MachOWriterExecutable.hpp: rescan fRegularDefAtomsThatOverrideADylibsWeakDef and only consider global ones
        
 
        
 
-2009-03-10    Nick Kledzik    <kledzik@apple.com>
+----- Tagged ld64-95.8.2
 
 
-       <rdar://problem/6665853> dyld weak linking optimization leaves some symbols unbound
-       * src/ld/MachOWriterExecutable.hpp: be sure to create bind entry for a reference 
-                                                                               to a symbol in a dylib that is a weak definition
-       * unit-tests/test-cases/coalesce_weak_def_in_dylib: add test case
+2009-03-18     Nick Kledzik    <kledzik@apple.com>
 
 
+       * src/ld/MachOReaderRelocatable.hpp: back out -force_cpusubtype_ALL changes
 
 
-2009-03-10    Nick Kledzik    <kledzik@apple.com>
 
 
-       <rdar://problem/6666004> many OS i386 OS dylibs still have __IMPORT segment
-       * ld/MachOReaderRelocatable.hpp: moved where __IMPORT/__pointer is changed to __DATA/__nl_symbol_ptr
-       * unit-tests/test-cases/stripped-indirect-symbol-table:  updated to test for this problem
+----- Tagged ld64-95.8.1
 
 
+2009-03-17     Nick Kledzik    <kledzik@apple.com>
 
 
------ Tagged ld64-95.2.6
-
-2009-02-27     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/6633530> ld might set MH_WEAK_DEFINES when it should not
-       * src/ld/MachOWriterExecutable.hpp: only consider atoms in fRegularDefAtomsThatOverrideADylibsWeakDef
-                                                                               that will be exported when computing MH_WEAK_DEFINES
-       * unit-tests/test-cases/operator-new: updated to reproduce issue
+       <rdar://problem/6578416> -dead_strip inhibits weak coalescing in no_dead_strip section  
+       * src/ld/ld.cpp: in markDead() remove from fLiveRootAtoms
        
        
-
------ Tagged ld64-95.2.5
-
-2009-02-24     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/6605499> x86_64 obj-c runtime confused when static lib is stripped
-       * src/ld/MachOWriterExecutable.hpp: in setLocalNlist() don't use 'l' labels for x86_64 strings
-       * unit-tests/test-cases/objc-literal-pointers-strip: added test case
        
        
+2009-03-17     Nick Kledzik    <kledzik@apple.com>
 
 
------ Tagged ld64-95.2.4
-
-2009-02-23     Nick Kledzik    <kledzik@apple.com>
+       <rdar://problem/6671072> libgcc fails to build in with ld64-95.8
+       * src/ld/MachOReaderRelocatable.hpp: interpret CPU_SUBTYPE_ARM_ALL as CPU_SUBTYPE_ARM_V4T
+       * src/ld/Options.cpp: interept -force_cpusubtype_ALL as -arch armv4t
 
 
-       * src/ld/MachOReaderRelocatable.hpp: ignore ARM_THUMB_32BIT_BRANCH relocs
 
 
+----- Tagged ld64-95.8
 
 
-2009-02-18     Nick Kledzik    <kledzik@apple.com>
+2009-02-09     Nick Kledzik    <kledzik@apple.com>
 
 
-       <rdar://problem/6583555> Writer<A>::symbolIndex() uses a linear search and does not scale
-       * src/ld/MachOWriterExecutable.hpp: build a std::map so symbolIndex() scales better
-       
+       <rdar://problem/6569316> ld64-95.7 crashes building Foundation-678.39 in side build
+       * src/ld/MachOReaderRelocatable.hpp: handle a zero length section with a label before __cstring section
 
 
-2009-02-18     Nick Kledzik    <kledzik@apple.com>
 
 
-       <rdar://problem/6312070> Use new compact encodings that handle all register permutations
-       * src/ld/Architectures.hpp: add kSectionOffset24
-       * src/ld/ObjectFile.h: add getFDE()
-       * src/ld/MachOReaderRelocatable.hpp: use new libunwind functions to get new compact encoding
-       * src/ld/MachOWriterExecutable.hpp: use new compact encoding which includes offset in dwarf if needed
-       * src/other/unwinddump.cpp: update unwinddump output to display register save set
-       
+----- Tagged ld64-95.7
 
 
-2009-02-16     Nick Kledzik    <kledzik@apple.com>
+2009-02-06     Nick Kledzik    <kledzik@apple.com>
 
 
-       <rdar://problem/6511619> runtime error with bundle for 10.5 that has weak external symols
-       * src/ld/ld.cpp: fix hybrid (10.5) compressed linkedit info for data pointing to weak definitions
+       * src/ld/ObjectFile.h: make fAddCompactUnwindEncoding false by default
        
 
        
 
-2009-02-15     Nick Kledzik    <kledzik@apple.com>
+2009-02-06     Nick Kledzik    <kledzik@apple.com>
 
 
-       <rdar://problem/6583757> i386 relocation error with negative offsets from local labels
-       * src/ld/MachOReaderRelocatable.hpp: handle when base addr of scattered relocation does not point to a label
-       * unit-tests/test-cases/relocs-neg-from-local: add test case
+       <rdar://problem/6537210> ER: add linker option to zero fill empty DATA sections on disk
+       * src/ld/Options.cpp: add support for -no_zero_fill_sections
+       * src/ld/MachOReaderRelocatable.hpp: isZeroFill() is only true if fOptimizeZeroFill 
+       * doc/man/man1/ld.1: document -no_zero_fill_sections
+       * unit-tests/test-cases/no_zero_fill_sections: add test case
        
 
        
 
-2009-02-12     Nick Kledzik    <kledzik@apple.com>
+2009-02-05     Nick Kledzik    <kledzik@apple.com>
 
 
-       <rdar://problem/6578360> -dead_strip inhibits weak coalescing in no_dead_strip section
-       * src/ld/ld.cpp: remove atoms coalesced away from fLiveRootAtoms
-       * unit-tests/test-cases/dead_strip-weak-coalesce: added test case
+       <rdar://problem/6497366> label getting resolved to the wrong address.
+       * src/ld/MachOWriterExecutable.hpp: add findAtomAndOffsetForSection() and use it to disambiguate
+       * unit-tests/test-cases/label-on-end-of-section: added test case
 
 
 
 
-2009-02-12     Nick Kledzik    <kledzik@apple.com>
+2009-01-27     Nick Kledzik    <kledzik@apple.com>
 
 
-       <rdar://problem/6581809> x86_64 weak_import broken for initialized data
-       * src/ld/MachOReaderRelocatable.hpp: use isWeakImportSymbol() in Reader<x86_64>::addRelocReference()
-       * src/other/dyldinfo.cpp: update to display weak_import attribute
-       * unit-tests/test-cases/weak_import: updated test case
+       <rdar://problem/6517393> Warn -force_cpusubtype_ALL is not supported
+       * src/ld/Options.cpp: warn if fForceSubtypeAll and fArchitecture is CPU_TYPE_ARM
        
 
        
 
-2009-02-06     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/6541812> ld parsing of __eh_frame unwind information is slow
-       * src/ld/MachOReaderRelocatable.hpp: build a std::map of all __eh_frame relocations for x86_64
+----- Tagged ld64-95.6
 
 
+2009-01-25     Nick Kledzik    <kledzik@apple.com>
 
 
------ Tagged ld64-95.2.3
+       <rdar://problem/6439020> Add support for section start/end labels
+       * src/ld/ObjectFile.h: add kSectionStart and kSectionEnd
+       * src/ld/MachOReaderRelocatable.hpp: create SectionBoundaryAtoms as needed
+       * src/ld/ld.cpp: sort SectionBoundaryAtoms correctly
+       * src/ld/MachOWriterExecutable.hpp: allow all relocations in preload images
 
 
-2009-02-04     Nick Kledzik    <kledzik@apple.com>
 
 
-       <rdar://problem/6545406> ld: warning: can't add line info to anonymous symbol
-       * src/ld/MachOReaderRelocatable.hpp: don't warn about line info in dyld stubs
+----- Tagged ld64-95.5
 
 
+2009-01-15     Nick Kledzik    <kledzik@apple.com>
 
 
------ Tagged ld64-95.2.2
+       * src/ld/MachOWriterExecutable.hpp: in hasPageCrossingBranches() ignore branches preceeded by a branch
 
 
-2009-02-02     Nick Kledzik    <kledzik@apple.com>
 
 
-       <rdar://problem/6548268> ld -r does not preserve the N_NO_DEAD_STRIP bit
-       * src/ld/MachOWriterExecutable.hpp: set N_NO_DEAD_STRIP based on dontDeadStrip()
-       * unit-tests/test-cases/dead_strip-r_symbol_desc: added test case
+----- Tagged ld64-95.4
 
 
+2009-01-15     Nick Kledzik    <kledzik@apple.com>
 
 
------ Tagged ld64-95.2.1
+       * src/ld/Options.cpp: handle -kext and -r the same for fPreventPageCrossingBranches
 
 
-2009-01-29     Nick Kledzik    <kledzik@apple.com>
 
 
-       <rdar://problem/6535736> ld coalesces C strings in different segments
-       * src/ld/MachOReaderRelocatable.hpp: only do standard coalescing on __cstring section if is in __TEXT segment
-       * unit-tests/test-cases/cstring-alt-segment: add test case
-       
+----- Tagged ld64-95.3
 
 
-2009-01-29     Nick Kledzik    <kledzik@apple.com>
+2009-01-14     Nick Kledzik    <kledzik@apple.com>
 
 
-       <rdar://problem/6532377> gcc DejaGnu failure: building longcall/dylib library
-       * src/ld/MachOWriterExecutable.hpp: if no __DATA sections insert non-lazy pointers at end of __TEXT segment
-       * unit-tests/test-cases/no-data-bundle: added test case
+       <rdar://problem/6497574> linker should alter layout to prevent armv7 page crossing branches
+       * src/ld/Options.cpp: set fPreventPageCrossingBranches
+       * src/ld/MachOWriterExecutable.hpp: adjust layout of __text so there are not page crossing branches
+       * src/ld/MachOReaderRelocatable.hpp: support new ARM_THUMB_32BIT_BRANCH reloce
 
 
 ----- Tagged ld64-95.2
 
 
 ----- Tagged ld64-95.2
 2009-01-06     Nick Kledzik    <kledzik@apple.com>
 
        <rdar://problem/6476760> strip -S fails with "new trie is larger than original"
 2009-01-06     Nick Kledzik    <kledzik@apple.com>
 
        <rdar://problem/6476760> strip -S fails with "new trie is larger than original"
-       * src/other/PruneTrie.cpp: don't align trie more than original trie was aligned
-       
-
------ Tagged ld64-95.1
-
-2008-12-21     Nick Kledzik    <kledzik@apple.com>
-
-        * src/ld/MachOWriterExecutable.hpp: in new linkedit format, make sure only exported symbols
-                                       make it into weak binding info
-       
-       
------ Tagged ld64-95
-
-2008-12-18     Nick Kledzik    <kledzik@apple.com>
-
-       * src/ld/Options.cpp: move check for fSharedRegionEligible until fPrebind has stabilized
-       
-
-2008-12-18     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/6305021> Generate new compressed LINKEDIT when targeting 10.6
-       * src/ld/Options.cpp: turn on compressed LINKEDIT by default
-       
-
------ Tagged ld64-94.1
-
-2008-12-16     Nick Kledzik    <kledzik@apple.com>
-
-       * src/ld/Options.cpp: Fix -F handling in buildSearchPaths()
-
-
------ Tagged ld64-94
-
-2008-12-15     Nick Kledzik    <kledzik@apple.com>
-
-       * doc/man/man1/ld.1: document new options
-       
-
-2008-12-15     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/6134468> linker should enforce all .o files have same sub-type, and ignore sub-type of dylibs
-       * doc/man/man1/ld.1: update man page about -allow_sub_type_mismatches
-       * src/ld/ld.cpp: call validFile() with new arguments
-       * src/ld/MachOReaderRelocatable.hpp: add new arguments to validFile()
-       * src/ld/Options.cpp: Support LD_ALLOW_CPU_SUBTYPE_MISMATCHES and -allow_sub_type_mismatches
-       
-
-2008-12-15     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/6438270> -syslibroot should skip standard search paths not in the SDK
-       * src/ld/Options.cpp: in buildSearchPaths() if an SDK is specified don't add 
-                                                       standard search paths not in the SDK.
-
-
-2008-12-15     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/6406609> ld: remove "can't make compact unwind encoding" warning
-       * src/ld/ObjectFile.h: add fWarnCompactUnwind
-       * src/ld/Options.cpp: -warn_compact_unwind --> fWarnCompactUnwind
-       * src/ld/MachOReaderRelocatable.hpp: test fWarnCompactUnwind before warning
-
-
-2008-12-15     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/6442926> Add dtrace usdt support for arm to ld64
-       * src/ld/MachOWriterExecutable.hpp: handle arm::kDtraceIsEnabledSite
-       * unit-tests/test-cases/dtrace-static-probes: use is-enabled in test case
-
-
------ Tagged ld64-93
-
-2008-12-11     Nick Kledzik    <kledzik@apple.com>
-
-       * src/ld/ObjectFile.h: add fIPhoneVersionMin to track min iPhoneOS version
-       * src/ld/Options.cpp: use fIPhoneVersionMin 
-       
-
-2008-12-11     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/6431277> non-lazy pointer to non-global tentative definition encoded wrong
-       * src/ld/MachOWriterExecutable.hpp: don't use INDIRECT_SYMBOL_LOCAL for tentative definitions
-       * unit-tests/test-cases/non-lazy-r: updated test case
-
-
-2008-12-11     Nick Kledzik    <kledzik@apple.com>
-       
-       <rdar://problem/6437667> kernel fails to boot when ld64 used for intermediate ld -r step
-       * src/ld/MachOWriterExecutable.hpp: in -r mode when generating a scattered sect-diff reloc for
-                                                                       i386/arm, special case when from target is not the atom 
-                                                                       the relocation is in.
-       * unit-tests/test-cases/relocs-asm: update test case
-       
-
-2008-12-11     Nick Kledzik    <kledzik@apple.com>
-
-       * src/ld/ld.cpp: handle new __program_vars section
-       * src/ld/MachOWriterExecutable.hpp: handle inserting synthesized sections when there is no __dyld section
-
-
-2008-12-11     Nick Kledzik    <kledzik@apple.com>
-
-       * src/ld/MachOReaderRelocatable.hpp: Fix getDescription() to work when direct reference is to anonymous atom
-
-
-2008-12-10     Nick Kledzik    <kledzik@apple.com>
-
-       * src/ld/Options.cpp: enable LD_FORCE_NO_PREBIND to be used with arm
-
-
-2008-12-10     Nick Kledzik    <kledzik@apple.com>
-       
-       <rdar://problem/6258169> Developer tool to print the new compressed LINKEDIT information
-       * src/other/dyldinfo.cpp: fix typo in usage()
-       
-
-2008-12-05     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/6308882> SnowLeopard kernel should compile warning free
-       * src/ld/MachOReaderRelocatable.hpp: correct parse two global labels at end of section and make one an alias
-       * unit-tests/test-cases/end-label: update test case
-
-
-2008-12-04     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/6342245> Better warning than "PPC_RELOC_JBSR should not be using an external relocation"
-       * src/ld/MachOReaderRelocatable.hpp: issue warning with .o path if it was compiled with -mlong-branch
-
-
-2008-12-04     Nick Kledzik    <kledzik@apple.com>
-       
-       <rdar://problem/6408832> linker should not map __pointers -> __nl_symbol_ptr unless actually making new LINKEDIT
-       * src/ld/ObjectFile.h: add fMakeCompressedDyldInfo for readers to see
-       * src/ld/Options.cpp: set fMakeCompressedDyldInfo for readers to see
-       * src/ld/MachOReaderRelocatable.hpp: check fMakeCompressedDyldInfo
-
-
-2008-12-02     Nick Kledzik    <kledzik@apple.com>
-
-       * src/ld/debugline.c: fix error handling in line_open()
-       
-
-2008-11-26     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/6401277> vtable with thumb entries broke after ld -r
-       * src/ld/MachOReaderRelocatable.hpp: if target of reloc is thumb, mask thumb bit off addend
-       * unit-tests/test-cases/thumb-pointer: added test case
-
-
-2008-11-26     Nick Kledzik    <kledzik@apple.com>
-
-       * src/ld/Option.cpp: Fix how crashreporterBuffer is created to not miss some arguments
-       
-
-2008-11-24     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/6398605> Security.framework has some duplicate FDEs for some functions
-       * src/ld/ld.cpp: remove fDeadAtoms from fLiveAtoms when there are weak atoms overriden by late loads
-       * unit-tests/test-cases/dead_strip-archive-eh: added test case
-
-
------ Tagged ld64-92
-
-2008-11-21     Nick Kledzik    <kledzik@apple.com>
-
-       * src/ld/MachOReaderDylib.hpp: if export_size is zero, no need to parse trie
-       * src/abstraction/MachOTrie.hpp: gracefully handle empty trie
-       
-
-2008-11-21     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/6257854> strip(1) support for new compressed LINKEDIT information
-       * ld64.xcodeproj/project.pbxproj: build and install new libprunetrie.a
-       * src/other/prune_trie.h: added
-       * src/other/PruneTrie.cpp: implements prune_trie()
-       
-
-2008-11-21     Nick Kledzik    <kledzik@apple.com>
-
-       * src/ld/ld.cpp: if an export file is used and all weak symbols are masked, don't set WEAK_DEFINES
-       * unit-tests/test-cases/weak-def-flag: added test case
-
-
-2008-11-20     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/6305021> Generate new compressed LINKEDIT when targeting 10.6
-       * src/ld/MachOWriterExecutable.hpp: support generating new compressed format
-       * src/ld/MachOReaderRelocatable.hpp: new compress format implies non-lazy pointers in __DATA for i386
-       * src/ld/MachOReaderDylib.hpp: support linking aginst new format
-       * src/ld/Options.cpp: suppport -exported_symbols_order and -no_compact_linkedit
-       * src/ld/ld.cpp: track which atoms have weak counter parts in dylibs
-       * src/other/dyldinfo.cpp: added tool to display new LINKEDIT format
-       * ld64.xcodeproj/project.pbxproj: add dyldinfo tool
-       * unit-tests/*: lots of fixes to work with new format
-
-
-2008-11-20     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/6389316> ld64 should preserve N_WEAK_REF when linking MH_KEXT_BUNDLEs
-       * src/ld/MachOWriterExecutable.hpp: set up fWeakImportMap in synthesizeKextGOT() 
-
-
-2008-11-19     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/6342406> VideoToolbox.framework has bad __TEXT.__eh_frame info
-       * src/ld/Options.cpp: add -no_eh_labels option for use with -r
-       * src/ld/MachOWriterExecutable.hpp: generate correct x86_64 labeless relocs in -r mode
-       * src/ld/MachOReaderRelocatable.hpp: now ignore all labels and relocations in
-               __TEXT/__eh_frame section and rely on getCFIs() from libunwind
-       * unit-tests/test-cases/eh-coalescing-no-labels: add test case
-
-
-2008-11-19     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/6378110> LTO doesn't like dtrace symbols
-       * src/ld/LTOReader.hpp: ignore __dtrace_probe undefines in bitcode files
-       
-
-2008-11-14     Nick Kledzik    <kledzik@apple.com>
-
-       * src/abstraction/MachOFileAbstraction.hpp: fix to work with 10.5 headers
-       
-       
------ Tagged ld64-91
-
-2008-11-07     Nick Kledzik    <kledzik@apple.com>
-
-       Remove COMPACT_UNWIND_SUPPORT conditionalizing
-       
-
-2008-11-06     Nick Kledzik    <kledzik@apple.com>
-
-       Reorganize source layout.  ld sources are now in "ld",
-       and other tools are in "other".
-       
-
-2008-11-05     Nick Kledzik    <kledzik@apple.com>
-
-       * ld64.xcodeproj/project.pbxproj: start installing unwinddump tool
-       * src/UnwindDump.cpp: support -arch option
-       * doc/man/man1/unwinddump.1: create man page
-
-
-2008-11-05     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/6337329> linker should put cpusubtype in n_sect field of nlist entry for N_OSO debug note entries
-       * src/ld.cpp: in synthesizeDebugNotes() set other field of OSO to be subtype
-
-
-2008-11-05     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/3738966> Need a linker option to load all objects from one library
-       * src/Options.cpp: support -force_load option
-       * src/ArchiveReader.hpp: Add fForceLoad ivar
-       * doc/man/man1/ld.1:  update man page with -force_load option
-       * unit-tests/test-cases/archive-force-load: add test case
-
-
-2008-11-05     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/6308882> Dtrace Probe Warnings: SnowLeopard kernel should compile warning free
-       * src/ld.cpp: don't generate GSYM stabs for old style __dtrace_probe
-       * src/MachOReaderRelocatable.hpp: fix test for deciding if a symbol is an alias
-       
-
-2008-11-04     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/6294378> ADOBE: XCODE: ld: duplicate typeinfo in executable
-       * src/ld.cpp: in dead-strip mode, record overriden symbols and later rebind all uses
-       * unit-tests/test-cases/dead_strip-archive-weak: add test case
-       
-
-2008-11-03     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/6254202> support increased branch range in Thumb-2
-       * src/MachOReaderRelocatable.hpp: handle full branch range in addRelocReference()
-       * unit-tests/test-cases/branch-distance: added test case
-       
-2008-10-31     Devang Patel    <dpatel@apple.com>
-
-       <rdar://problem/5725712> Sqlite 3.5.4 built with lvm-gcc-4.2 -O4 fails regression test
-       * src/LTOReader.hpp: Use real atom scope when real atom is available.
-       Preserve globals while optimizing an executable.
-
-2008-10-30     Nick Kledzik    <kledzik@apple.com>
-
-       * src/MachOReaderRelocatable.hpp: support all encodings in getEncodedP()
-
-
------ Tagged ld64-90
-
-2008-10-30     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/6327584> icc has dwarf unwind info that is different than gcc
-       * src/MachOReaderRelocatable.hpp: support more encodings in getEncodedP()
-
-
-2008-10-23     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/6088653> build ld64 for x86_64
-       * ld64.xcodeproj/project.pbxproj: add X86_64 to valid archs
-       
-
-2008-10-23     Nick Kledzik    <kledzik@apple.com>
-
-       * ld64.xcodeproj/project.pbxproj: use generated @$(DERIVED_FILE_DIR)/linker_opts for extra
-               linker options.  This allows linker to be built if LTO headers and libs are missing.
-
-
-2008-10-23     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/6273617> Linker warning not shown in the Xcode build log
-       * src/Options.cpp: add colon to format string in warning()
-
-
------ Tagged ld64-89.3
-
-2008-10-24     Nick Kledzik    <kledzik@apple.com>
-       
-       <rdar://problem/6317985> ld64-89 broke TOT OpenGL libProgrammability x86_64 build       
-       * src/MachOReaderRelocatable.hpp: add cast in getEncodedP()
-       
-
------ Tagged ld64-89.2
-
-2008-10-23     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/6312895> SnowLeopard: Libsystem built with ld64-89.1 causes crashes
-       * src/MachOReaderRelocatable.hpp: when FDE information causes __text atom to be split, make the 
-                       atoms follow-on pairs.
-
-
------ Tagged ld64-89.1
-
-2008-10-22     Nick Kledzik    <kledzik@apple.com>
-
-       * src/MachOReaderRelocatable.hpp: for x86_64 __eh_frame force direct references
-       
-
-2008-10-21     Nick Kledzik    <kledzik@apple.com>
-
-       * src/ObjectDump.cpp: Use getContentType() to see if content type is a cstring
-       
-
------ Tagged ld64-89
-
-2008-10-21     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/6253171> 10A180 with QT-1119 roots: iTunes and QuickTime cannot play back purchased videos
-       <rdar://problem/5950453> linker should not need .eh labels
-       * src/MachOWriterExecutable.hpp: use kCFIType to set section attributes
-       * src/MachOReaderRelocatable.hpp: use libunwind's CFITuple to parse __eh_frame content
-       * src/ld.cpp: Add adjustScope() phase instead of demoting scope within symboltable.add()
-       * unit-tests/test-cases/eh-stripped-symbols: added test case
-
-
------ Tagged ld64-88.1
-
-2008-10-16     Nick Kledzik    <kledzik@apple.com>
-
-       * src/MachOReaderRelocatable.hpp: Fix uses of COMPACT_UNWIND_SUPPORT
-       * src/MachOWriterExecutable.hpp: Fix uses of COMPACT_UNWIND_SUPPORT
-
-
-2008-09-30     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/6255983> OBJC2: Reorder __DATA,__objc_* sections by writedness
-       * src/ld.cpp: change sorting order of Sections
-
-
-2008-09-29     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/6159479> Executable produced by XCode 3.2 on 10.6 crashes on 10.3.9
-       * src/MachOWriterExecutable.hpp: set objc_module_info_addr field of module table
-       
-
------ Tagged ld64-88
-
-2008-09-25     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5935708> kexts need to be built as MH_BUNDLE mach-o files
-       * src/ld.cpp: use getUndefinedProxyAtom() with kKextBundle
-       * src/MachOFileAbstraction.hpp: add MH_KEXT_BUNDLE
-       * src/Options.cpp: support -kext for all architectures
-       * src/MachOWriterExecutable.hpp: support kKextBundle to make a bundle like kext
-       * unit-tests/test-cases/kext-basic: added test case
-       
-
-2008-09-25     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/6052546> ld invoking wrong ld_classic
-       * src/Options.cpp: first look for ld_classic relative to ld itself
-       
-
-2008-09-25     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5855588> ld fails to link references from 32 bit code into 64 bit code
-       <rdar://problem/5955200> Desired 32-bit absolute relocation
-       * src/Architectures.hpp: add x86_64::kPointer32
-       * src/MachOReaderRelocatable.hpp: support X86_64_RELOC_UNSIGNED with length=2
-       * src/MachOWriterExecutable.hpp: support x86_64::kPointer32
-       * unit-tests/test-cases/relocs-asm/relocs-asm.s: added 32-bit pointer tests
-       
-
-2008-09-25     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/6075323> Should be able to mark dylibs as auto-dead-dylib-strip
-       * src/Options.h: add fMarkDeadStrippableDylib
-       * src/MachOReaderDylib.hpp: check MH_DEAD_STRIPPABLE_DYLIB
-       * src/ObjectFile.h: add deadStrippable()
-       * src/MachOFileAbstraction.hpp: add MH_DEAD_STRIPPABLE_DYLIB
-       * src/Options.cpp: support -mark_dead_strippable_dylib
-       * src/MachOWriterExecutable.hpp: test reader->deadStrippable(), set MH_DEAD_STRIPPABLE_DYLIB
-       * doc/man/man1/ld.1: update man page
-       * unit-tests/test-cases/dead_strippable_dylib: added test case
-       
-
-2008-09-25     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/6197601> ER: Add -seg_page_size option
-       * src/Options.cpp: add -seg_page_size option
-       * src/MachOWriterExecutable.hpp: use new page size info when laying out segments
-       * doc/man/man1/ld.1: update man page
-       
-
-2008-09-24     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5798786> -arch_errors_fatal not working
-       * src/ld.cpp: check fOptions.errorOnOtherArchFiles()
-       * src/Options.cpp: turn -arch_errors_fatal into fOptions.errorOnOtherArchFiles()
-
-
-2008-09-24     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/6161215> CrashTracer: [USER] 1 crash in ld at ld: 0x5ce02
-       * src/ld.cpp: abort if resolve() finds an unresolved reference, rather than allow a future crash
-       
-
-2008-09-24     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/6157989> linker crashes linking X86-64 with -fwritable-strings
-       * src/MachOReaderRelocatable.hpp: handle unbound cfstring references
-       * unit-tests/test-cases/cfstring-coalesce: update test case
-       
-
-2008-09-24     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/6213035> ld64: bl out of range (-17147704 max is +/-16M) on ppc
-       * src/MachOWriterExecutable.hpp: tweak branch island regions to be every 14MB instead of 15MB
-       
-
-2008-09-24     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5907981> -filelist fails with comma in path
-       * src/Options.cpp: in loadFileList() first try without special comma meaning 
-       * unit-tests/test-cases/filelist/Makefile: update test case
-       
-
-2008-09-23     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/6203068> nop not used when aligning functions in -r mode
-       * src/MachOWriterExecutable.hpp: change check for when to pad with nops to not test segment's name
-       
-
-2008-09-23     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/6238329> "-pie can only be used when linking a main executable" should be a warning, not an error
-       *  src/Options.cpp: make -pie on a dylib or bundle be a warning instead of an error
-       
-       
-2008-09-23     Nick Kledzik    <kledzik@apple.com>
-
-       * src/MachOReaderRelocatable.hpp: add warning if dwarf cannot be encoded as compact unwind
-       
-
-2008-09-18     Nick Kledzik    <kledzik@apple.com>
-
-       * src/LTOReader.hpp: re-enable use of lto_codegen_debug_options()
-
-
-2008-09-16     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/6219054> ld does not always set S_CSTRING_LITERALS on __TEXT,__cstring
-       * src/MachOReaderRelocatable.hpp: add getContentType() to SymbolAtom
-       * src/MachOWriterExecutable.hpp: for x86_64 don't override named cstrings with LC* name
-       
-
-2008-09-10     Nick Kledzik    <kledzik@apple.com>
-
-       * Options.cpp: add __crashreporter_info__ to communicate command line to crash reporter
-       * ld64.xcodeproj/project.pbxproj: leave local symbols in ld to provide better crash reports
-
-
-2008-09-08     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/6126637> 161569 GCC 4.2 - breakpoints no longer work for a large number of functions
-       * src/MachOReaderRelocatable.hpp: support DW_FORM_strp out-of-line strings when parsing line table
-
-
-2008-09-02     Nick Kledzik    <kledzik@apple.com>
-
-       * src/MachOReaderRelocatable.hpp: fix compact unwind personality for dyld and -slow_stubs
-       
-
-2008-08-29     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/6186838> -weak_library no longer forces uses to be weak_import
-       * src/MachOWriterExecutable.hpp: use fWeakImport on dylib to force proxy atoms into fWeakImportMap
-       * unit-tests/test-cases/weak_import-force: added test case
-       
-
-2008-08-29     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/6061558> linker should order __DATA segment to reduce dyld dirtied pages
-       * src/Options.cpp: add fOrderData and support -no_data_order
-       * src/ld.cpp: modify tweakLayout() to sort atoms with relocations to start of __data section 
-
-
-2008-08-27     Nick Kledzik    <kledzik@apple.com>
-
-       * src/Options.cpp:  back out <rdar://problem/6174493>
-
-
------ Tagged ld64-87.5
-
-2008-08-26     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/6174493> some projects show _Unwind_Resume coming from libSystem.B.dylib
-       * src/Options.cpp: swap any early symlinks to libSystem with libgcc_s
-
-
------ Tagged ld64-87.4
-
-2008-08-25     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/6174493> some projects show _Unwind_Resume coming from libSystem.B.dylib
-       * src/Options.cpp: swap any early libSystem with libgcc_s
-       
-
-2008-08-15     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5898326> Unable to build ppc debug builds (linker out of range error)
-       * src/MachOWriterExecutable.hpp: in addPPCBranchIslands() look ahead so large atoms don't push out branch islands
-
-       
------ Tagged ld64-87.3.1
-
-2008-09-08     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/6204202> i386 dylibs have incorrect personality pointers when put in dyld shared cache
-       * src/MachOWriterExecutable.hpp: in addCrossSegmentRef() handle kImageOffset32 to __IMPORT segment
-
-       
------ Tagged ld64-87.3
-
-2008-08-09     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/6125381> work around compiler gcc_except_table alignment
-       * src/ObjectFile.h: change getLSDA() to return a reference instead of an atom
-       * src/MachOReaderRelocatable.hpp: special case __eh_frame 64-bit pointer diff relocations
-       * src/MachOWriterExecutable.hpp: track lsda offset when creating __unwind_info section
-       * src/UnwindDump.cpp: log when LDSA content does not start with 0xFF
-
------ Tagged ld64-87.2
-
-2008-08-07     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/6131559> 10A141: libuwind falls back to dwarf and makes whole system super slow
-       * src/MachOWriterExecutable.hpp: Fix sign extension bug with x86_64::kPointerDiff24
-       * src/UnwindDump.cpp: warn about mangled LSDA entries when dumping unwind section
-       
-
------ Tagged ld64-87.1
-
-2008-08-03     Nick Kledzik    <kledzik@apple.com>
-
-       * src/LTOReader.hpp: Don't use lto_codegen_debug_options until newer libLTO.dylib is available
-
-
------ Tagged ld64-87
-
-2008-07-21     Nick Kledzik    <kledzik@apple.com>
-
-       * src/Options.cpp: Always set fAutoOrderInitializers=false for dyld
-       
-
-2008-07-21     Nick Kledzik    <kledzik@apple.com>
-
-       * src/MachOWriterExecutable.hpp: fix when regular vs compressed __unwind_info pages are generated
-       * src/UnwindDump.cpp: fix function name decoding in regular pages 
-       
-       
-2008-07-21     Nick Kledzik    <kledzik@apple.com>
-
-       * ld64.xcodeproj/project.pbxproj: don't allow ld to build for x86_64 until libdtrace.dylib is available
-       
-
-2008-07-18     Nick Kledzik    <kledzik@apple.com>
-
-       * src/MachOReaderRelocatable.hpp: don't crash if debug_line section has no line table
-
-
-2008-07-18     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5628149> Duplicate probe firings in Security.framework
-       * src/LTOReader.hpp: optimize() now returns atoms optimized away
-       * src/ObjectFile.h: optimize() should return if it did anything
-       * src/ArchiveReader.hpp: pass through optimize() result
-       * src/ld.cpp: rework dtrace probe processing as a new pass to prevent double counting
-
-
-2008-07-15     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/6061904> automatically order initializers to start of __TEXT
-       * src/Options.cpp: add -no_order_inits option
-       * src/MachOReaderRelocatable.hpp: merge __StaticInit into __text
-       * src/ObjectFile.h: add fAutoOrderInitializers
-       * src/ld.cpp: sort initializer to start of __text and terminators to end
-       * doc/man/man1/ld.1: add doc about -no_order_inits
-       * unit-tests/test-cases/init-order: add test case
-
-2008-07-15     Nick Kledzik    <kledzik@apple.com>
-       
-       <rdar://problem/6073697> Only add LC_SEGMENT_SPLIT_INFO to dylibs that might be in the shared cache
-       * src/MachOWriterExecutable.hpp: re-layout load commands after split-seg data computed
-       * src/Options.cpp: non-public install name will disable split-seg load command
-       
-
-2008-07-14     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/6069861> ld -r for x86_64 is changing visibility of cstring constants
-       * src/MachOWriterExecutable.hpp: force x86_64 cstring labels to be local in -r mode
-       * unit-tests/test-cases/cstring-label: added test case
-       
-
-2008-07-11     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/6070190> ld not adding updating LC_SEGMENT_SPLIT_INFO with __unwind_info section
-       * src/MachOWriterExecutable.hpp: run createSplitSegContent() after __unwind_info section is created
-       
-2008-07-10     Nick Kledzik    <kledzik@apple.com>
-
-       * src/LTOReader.hpp: improve missing symbol error message
-
-
-2008-07-09     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/6061558> linker should order __DATA segment to reduce dyld dirtied pages
-       * src/ld.cpp: first phase, order sections
-
-
-2008-07-08     Nick Kledzik    <kledzik@apple.com>
-
-       * src/MachOReaderRelocatable.hpp: remove "coal" sections when creating a final linked image
-
-
-2008-07-08     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/6054476> ld: add support for mllvm LTO options
-       * src/Options.cpp: support -mllvm option
-       * src/LTOReader.hpp: call lto_codegen_debug_options() with -mllvm options
-       * src/ld.cpp: pass llvmOptions to optimize()
-       * src/Options.h: add fLLVMOptions
-       * src/ArchiveReader.hpp: add llvmOptions parameter to optimize()
-       * src/ObjectFile.h: add llvmOptions parameter to optimize()
-       * unit-tests/test-cases/lto-llvm-options: add test case
-       
-       
-2008-07-07     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/6054296> Linker fails with: 24-bit pointer diff out of range in unwind info in unwind info from...
-       * src/MachOWriterExecutable.hpp: fix when to fallback to uncompressed unwind info
-
-
-2008-07-03     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/6001472> ld crash with gcc-4.0 code that uses a zero sized array
-       * src/MachOReaderRelocatable.hpp: handle zero size atom in a zero sized section
-       
-
-2008-07-03     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/6016809> ld crashes when bad ppc relocs are found
-       * src/MachOReaderRelocatable.hpp: change all missing PAIR warnings to errors
-       
-
-2008-07-02     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5881324> when linking a kext the static linker should leave a pad in the headers to allow code signing
-       * src/MachOWriterExecutable.hpp: add padding for load commands in object files
-       * unit-tests/test-cases/code-signed-object-file: added test case
-       
-
-2008-07-02     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/6048484> LC_SEGMENT_64 filesize incorrect for MH_OBJECT filetype
-       * src/MachOWriterExecutable.hpp: correctly set segment size info in object files
-       * unit-tests/test-cases/no-object-symbols: add test case
-
-
-2008-06-26     Nick Kledzik    <kledzik@apple.com>
-
-       * ld64.xcodeproj/project.pbxproj: enable ld and rebase targets to build for x86_64
-       * src/rebase.cpp: remove unused fRelocBase field that was not 64-bit clean
-       * src/MachOReaderRelocatable.hpp: fix getEncodedP() to be 64-bit clean
-
-
------ Tagged ld64-86.3
-
-2008-06-17     Nick Kledzik    <kledzik@apple.com>
-       
-       * src/ld.cpp: fix loadUndefines() to double check undefine symbol was not already loaded
-
-       
------ Tagged ld64-86.2
-       
-2008-06-14     Nick Kledzik    <kledzik@apple.com>
-
-       * srd/ld.cpp: Add NULL check in getTentativesNames()
-       
-       
------ Tagged ld64-86.1
-
-2008-06-06     Nick Kledzik    <kledzik@apple.com>
-
-       * src/MachOWriterExecutable.hpp: fix header padding calculation for dyld
-       
-
------ Tagged ld64-86
-
-2008-06-04     Nick Kledzik    <kledzik@apple.com>
-
-       * src/LTOReader.hpp: if lto_codegen_add_module() fails, add explanation to error message
-       
-
-2008-06-04     Nick Kledzik    <kledzik@apple.com>
-
-       * src/ObjectFile.h: add deadAtoms parameter to optimize()
-       * src/ld.cpp: ditto
-       * src/ArchiveReader.hpp: ditto
-       * src/MachOReaderRelocatable.hpp: handle llvm use of 0x1B pointer encodings in CIEs
-       * src/LTOReader.hpp: make sure libLTO.dylib knows about any llvm symbol coalesced away
-       * unit-tests/test-cases/lto-weak-native-override: add test case
-
-
-2008-06-04     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5935600> LTO : 176.gcc and 177.mesa build failure at -O4
-       * src/LTOReader.hpp: make sure internal is returned by getAtoms()
-       * unit-tests/test-cases/lto-archive-dylib: update test case
-
-
-2008-06-03     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5894163> fix for 5613343 need to search for definitions for common symbols is broken
-       * src/ld.cpp: modify loadUndefines() to check for undefines in all files and tentative definitions but only in archives
-       * src/machochecker.cpp: check for undefine symbols and external symbols with same name
-       * unit-tests/test-cases/tentative-and-archive: update test case
-
-
-2008-06-03     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5935237> linker produces wrong result for 16-bit call relocations
-       * src/MachOReaderRelocatable.hpp: properly parse i386 scattered relocs for word sized pc-rel vanilla
-       * src/MachOWriterExecutable.hpp: propery compute displacement for x86::kPCRel16
-       * unit-tests/test-cases/relocs-asm: update test case with callw instructions
-       
-
-2008-06-03     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5905900> Building kext x86_64 with unexported symbols file causes linking problems
-       * src/MachOWriterExecutable.hpp: better check when creating undefined proxy atoms
-       * unit-tests/test-cases/unexported_symbols_list-r: added test case
-       
-
-2008-06-02     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5659338> S_CSTRING_LITERALS section type not preserved in executable
-       * src/ObjectFile.h: added ContentType
-       * src/MachOReaderRelocatable.hpp: set ContentType for anonymous string literals
-       * src/MachOWriterExecutable.hpp: set S_CSTRING_LITERALS if ContentType is kCStringType
-       * unit-tests/test-cases/cstring-custom-section: added test case
-       
-
-2008-06-02     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5980194> linker should produce __unwind_info section in final linked images
-       * src/ld.cpp: sort __unwind_info then __eh_frame section to end of __TEXT
-       * src/Architectures.hpp: add kImageOffset32 and kPointerDiff24
-       * src/ObjectFile.h: add compact unwind info support
-       * src/MachOReaderRelocatable.hpp: add compact unwind info support
-       * src/MachOFileAbstraction.hpp: add C++ wrappers for unwind section layout
-       * src/UnwindDump.cpp: new tool for dumping __unwind_info section
-       * src/MachOWriterExecutable.hpp: create __unwind_info section when needed
-       * src/ObjectDump.cpp: print unwind info
-       
-
-2008-06-02     Nick Kledzik    <kledzik@apple.com>
-
-       * unit-tests/test-cases/llvm-integration: split out some test cases
-       * unit-tests/test-cases/lto-preload-pie: added
-       * unit-tests/test-cases/lto-archive-dylib: added
-
-
-2008-05-30     Nick Kledzik    <kledzik@apple.com>
-
-       * unit-tests: fixes to build all tests with with gcc-4.2 on SnowLeopard
-       
-
-2008-05-30     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5536348> support -preload option to generate MH_PRELOAD binaries compatible with mtoc(1) and EFI
-       * src/ld.cpp: add entryPoint parameter to optimize()
-       * src/ArchiveReader.hpp: ditto
-       * src/ObjectFile.h: ditto
-       * src/LTOReader.hpp: use entryPoint parameter to optimize()
-       * src/Options.h: add kPreload and segment alignment
-       * src/Options.cpp: support -preload and -segalign
-       * src/MachOWriterExecutable.hpp: support kPreload and non-page aligned segments 
-
-
-2008-05-30     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4431008> ld should warn if passed -r and also dylibs
-       * src/ld.cpp: check for spurious dylibs in Linker::addDylib()
-
-
------ Tagged ld64-85.6
-       
-2008-11-01     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/6254202> support increased branch range in Thumb-2
-       * src/MachOWriterExecutable.hpp: in fixUpReferenceFinal() support new longer branch range
-
-
-2008-11-01     Nick Kledzik    <kledzik@apple.com>
-       
-       <rdar://problem/6104368> ld warning: unknown option to -iphoneos_version_min, not 1.x or 2.x
-       * src/Options.cpp: In setIPhoneVersionMin() support 3.x
-
-       
------ Tagged ld64-85.5
-
-2008-09-17     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/6162415> vtable pointers can be missing thumb bit
-       * src/MachOWriterExecutable.hpp: Writer<arm>::fixUpReferenceFinal() OR in the 1 bit if the target
-               of a arm::kReadOnlyPointer is thumb.
-
-
------ Tagged ld64-85.4
-
-2008-08-11     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/6138961> ld should ignore LD_PREBIND when processing a static archive
-       * src/MachOWriterExecutable.hpp: in setImportNlist() never use N_PBUD for object files
-       
------ Tagged ld64-85.3
-
-2008-07-14     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/6060912> Prebinding busted in DTSB
-       * src/Options.cpp: check for libstdc++.6.0.[49] in seg_addr_table
-       
-
------ Tagged ld64-85.2
-
-2008-05-06     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5905889> ARM ld should take W bit off of maxprot for __TEXT segment
-       * src/MachOWriterExecutable.hpp: for iPhone always set maxprot to be initprot in all segments
-
-
-2008-05-06     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5914343> encryptable images may not be signable
-       * src/MachOWriterExecutable.hpp: use minimum header padding when aligning __text section
-       
-
------ Tagged ld64-85 (Xcode 3.1)
-
-2008-04-29     Nick Kledzik    <kledzik@apple.com>
-
-       * ld64.xcodeproj/project.pbxproj: <llvm-c/lto.h> is moving from /usr/local/include to /Developer/usr/local/include
-
-
-2008-04-29     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5829579> ld doesn't honor "rightmost" -syslibroot argument
-       * src/Options.cpp: if last -syslibroot is /, then ignore all syslibroots
-
-
-2008-04-29     Nick Kledzik    <kledzik@apple.com>
-       
-       <rdar://problem/5866582> GLRendererFloat has bad __eh_frame section caused by mixing llvm-gcc and gcc object files
-       * src/MachOReaderRelocatable.hpp: make all atoms in __eh_frame section have 1-byte alignment
-       * src/MachOWriterExecutable.hpp: make __eh_frame section have pointer sized alignment
-
-
-2008-04-17     Nick Kledzik    <kledzik@apple.com>
-
-       * src/MachOReaderRelocatable.hpp: better cpu subtype support
-
-
-2008-04-14     Nick Kledzik    <kledzik@apple.com>
-       
-       <rdar://problem/5733759> ld64 has bad ARM branch island check
-       * src/MachOWriterExecutable.hpp: in addBranchIslands() don't force large arm programs to fail
-       
-
-2008-04-10     Nick Kledzik    <kledzik@apple.com>
-
-       * src/MachOWriterExecutable.hpp: fix stubs used with lazy dylibs
-       
-
------ Tagged ld64-84.4
-
-2008-04-10     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5847206> SPEC2000/eon built with -mdynamic-no-pic won't run
-       * src/Architectures.hpp: added arm::kReadOnlyPointer
-       * src/MachOReaderRelocatable.hpp: generate arm::kReadOnlyPointer
-       * src/MachOWriterExecutable.hpp: use arm::kReadOnlyPointer
-       * src/machochecker.cpp: allow MH_PIE bit
-       * unit-tests/test-cases/switch-jump-table: added test cases
-       
-
------ Tagged ld64-84.3
-
-2008-04-09     Nick Kledzik    <kledzik@apple.com>
-       
-       <rdar://problem/5852023> -undefined dynamic_lookup busted
-       * src/ld.cpp: don't create proxy atom when scanning for dylib duplicates
-       * unit-tests/test-cases/tentative-and-archive: use -undefined dynamic_lookup
-
-
------ Tagged ld64-84.2
-
-2008-04-04     Nick Kledzik    <kledzik@apple.com>
-
-       * src/ld.cpp: don't add .eh symbols to symbol table in -r mode
-       * unit-tests/test-cases/eh-coalescing-r: update to test out of order coalescing
-       
-
------ Tagged ld64-84.1
-
-2008-03-28     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5720961> ld should prefer architecture-specific variant over generic in fat object file
-       * src/Options.cpp: fully process -arch arguments into fArchitecture and fSubArchitecture
-       * src/ld.cpp: when -arch with a subtype is used, try to find the exact subtype from fat files
-       * unit-tests/test-cases/cpu-sub-types-preference: added test cases for arm and ppc
-       
-
------ Tagged ld64-84
-
-2008-03-28     Nick Kledzik    <kledzik@apple.com>
-
-       * src/LTOReader.hpp: don't print lto version, if lto is unavailable
-       
-
-2008-03-26     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5575399> Add LD_WARN_COMMONS to BigBear builds
-       * src/Options.cpp: Add support for LD_WARN_FILE which copies all warnings to a side file
-       
-
-2008-03-26     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5797713> Need encryption tag in mach-o file
-       <rdar://problem/5811920> linker should adjust arm final linked images so __text is never on the same page as the load commands
-       * src/MachOFileAbstraction.hpp: add support for encryption_info_command
-       * src/Options.cpp: add support for LD_NO_ENCRYPT and -no_encryption
-       * src/MachOWriterExecutable.hpp: add EncryptionLoadCommandsAtom
-       * src/machochecker.cpp: validate LC_ENCRYPTION_INFO
-       
-
-2008-03-25     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5712533> ld64 does not recognize LLVM bitcode archive files
-       * src/MachOReaderArchive.hpp: renamed to src/ArchiveReader.hpp
-       * src/ArchiveReader.hpp: sniff each member and instantiate correct reader
-       * src/ld.cpp: rename mach_o::archive::Reader to archive::Reader
-       * ld64.xcodeproj/project.pbxproj: rename MachOReaderArchive.hpp to ArchiveReader.hpp
-       * unit-tests/test-cases/llvm-integration: added test case
-
-
-2008-03-25     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5771658> ld64 should switch to new libLTO.dylib interface
-       <rdar://problem/5675690> Produce llvm bc file in 'ld -r' mode if all .o files are llvm bc
-       * src/LTOReader.hpp: rewrite from LLVMReader.hpp to use new lto_* C interface
-       * unit-tests/test-cases/llvm-integration: update and comment
-       * ld64.xcodeproj/project.pbxproj: update to lazy load libLTO.dylib 
-       * src/ld.cpp: rework and simplify Linker::optimize() 
-       * src/ObjectDump.cpp: Add -nm option
-       
-
-2008-03-25     Nick Kledzik    <kledzik@apple.com>
-
-       * src/MachOReaderRelocatable.cpp: Fix some .objc_class_name_ off by one problem
-       * src/MachOWriterExecutable.cpp: Fix some .objc_class_name_ off by one problem
-
-
-2008-03-24     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5814613> Xcode 3.1 breaks linkage of libgcj.9.dylib from gcc 4.3.0
-       * src/MachOWriterExecutable.cpp: Make sure all ivars in Writer are initialized.
-
-
-2008-03-21     Nick Kledzik    <kledzik@apple.com>
-
-       * src/Options.cpp: warn if -seg1addr value is not page aligned
-       
-
-2008-03-21     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5806437> Move ARM support outside of __OPEN_SOURCE__
-       * src/ld.cpp: remove __OPEN_SOURCE__ around arm support
-       * src/LLVMReader.hpp: remove __OPEN_SOURCE__ around arm support
-       * src/MachOReaderDylib.hpp: remove __OPEN_SOURCE__ around arm support
-       * src/ObjectFile.h: remove __OPEN_SOURCE__ around arm support
-       * src/MachOReaderRelocatable.hpp: remove __OPEN_SOURCE__ around arm support
-       * src/OpaqueSection.hpp: Cover arm support inside __OPEN_SOURCE__ macro check
-       * src/MachOWriterExecutable.hpp: remove __OPEN_SOURCE__ around arm support
-       * src/ObjectDump.cpp: remove __OPEN_SOURCE__ around arm support
-       * ld64.xcodeproj/project.pbxproj: remove ARM_SUPPORT from config.h
-       
-
------ Tagged ld64-83.2
-       
-2008-03-15     Nick Kledzik    <kledzik@apple.com>
-       
-       <rdar://problem/5801620> ld64-83 removes OBJC_CLASS_$ symbols from projects, causes catastrophic results
-       * src/Options.cpp: restore "case CPU_TYPE_ARM" in switch statement for .objc_class symbols in .exp files
-       * unit-tests/test-cases/objc-exported_symbols_list: added test case
-       
-       
------ Tagged ld64-83.1
-
-2008-03-14     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5800466> -iphone_version_min ==> -iphoneos_version_min
-       * src/Options.cpp: support -iphoneos_version_min as well
-       
-
------ Tagged ld64-83
-
-2008-03-10     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5791543> ld needs to strip iphone_version_min option if invoking ld_classic
-       * src/Options.cpp: suppress -iphone_version_min from being passed to ld_classic
-       
-
-2008-03-04     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4171253> ADOBE XCODE: Linker option to lazy load frameworks (cause dyld is too slow)
-       * src/MachOWriterExecutable.hpp: create lazy stubs and LC_LAZY_LOAD_DYLIB for lazy load dylibs
-       * src/Options.cpp: support -lazy-l, -lazy_library, and -lazy_framework
-       * src/MachOFileAbstraction.hpp: add LC_LAZY_LOAD_DYLIB and S_LAZY_DYLIB_SYMBOL_POINTERS until in cctools
-       * src/MachOReaderDylib.hpp: add isLazyLoadedDylib()
-       * src/ld.cpp: pass lazy helper atom to writer
-       * doc/man/man1/ld.1: document new options
-       * unit-tests/test-cases/lazy-dylib-objc: add test case
-       * unit-tests/test-cases/lazy-dylib: add test case
-       
-
------ Tagged ld64-82.7
-
-2008-03-07     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5787149> duplicate symbol literal-pointer@__OBJC@__message_refs@...
-       * src/MachOReaderRelocatable.hpp: AnonymousAtom from S_LITERAL_POINTERS section should be weak
-       * unit-tests/test-cases/objc-selector-coalescing: added test case
-
-       
------ Tagged ld64-82.6
-
-2008-03-04     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5779681> ld crashes building XsanFS for Snow Leopard Builds
-       * src/ld.cpp: add bool dylibsOnly parameter to addJustInTimeAtoms()
-       * unit-tests/test-cases/tentative-and-archive: added test case
-       
-2008-03-04     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5775822> ld64 should not force building with gcc 4.0
-       * ld64.xcodeproj/project.pbxproj: change rules to use "system" compiler instead of 4.0
-       
-
-2008-02-29     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5774730> Simulator frameworks are being build split-seg and not prebound
-       * src/Options.cpp: only splitseg if prebound
-
-
-2008-02-29     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5774231> Linker should not make GSYM debug note for .objc_category_* symbols
-       * src/ld.cpp: suppress GSYM debug notes for absolute symbols
-       * unit-tests/test-cases/objc-category-debug-notes: added test case
-
-
-2008-02-29     Nick Kledzik    <kledzik@apple.com>
-
-    <rdar://problem/5768970> non-ASCII CFString support is broken
-    * src/MachOReaderRelocatable.hpp: only name and coalesce cfstring constants if they use a __cstring
-    * unit-tests/test-cases/cfstring-utf16: add test case
-
-
-2008-02-25     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5366363> ld -r -x 
-       * doc/man/man1/ld.1: update man page to explain -r -x produces auto-stripped labels
-
-
------ Tagged ld64-82.5
-
-2008-02-12     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5738023> x86_64: -stack_size failure when large __bss is used
-       * src/ld.cpp: only move section already in __DATA segment to new __huge section 
-       * unit-tests/test-cases/stack_size_no_addr: updated test case to add large bss section
-       
-
------ Tagged ld64-82.4
-
-2008-02-06     Nick Kledzik    <kledzik@apple.com>
-       
-       <rdar://problem/5726215> comdat warnings with ld -r of C++ .o files
-       * unit-tests/test-cases/eh-coalescing-r: added test case
-       * src/ld.cpp: in ld -r mode don't warn about if .eh symbols are not static
-       
-
-2008-02-06     Devang Patel    <dpatel@apple.com>
-
-       <rdar://problem/5724990> LTO of Bom framework with -dead_strip causes ld(1) crash
-       * src/LLVMReader.hpp: Check fAtom while determining LLVMReference target binding.
-       * unit-tests/test-cases/llvm-integration/Makefile: Add new test case.
-       * unit-tests/test-cases/llvm-integration/a15.c: New.
-       * unit-tests/test-cases/llvm-integration/b15.c: New.
-       * unit-tests/test-cases/llvm-integration/c15.c: New.
-       
-2008-02-05     Nick Kledzik    <kledzik@apple.com>
-
-       * src/ld.cpp: fix for -arch ppc -mdynamic-no-pic -pie so PPC_RELOC_HA16 reloc is used
-       
------ Tagged ld64-82.3
-       
-2008-02-04     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5721186> ld doesn't seem to understand $ld$add$os... and $ld$hide$os... for 10.6 moves
-       * src/ObjectFile.h: add 10.6
-       * src/Options.cpp: add 10.6 support
-       * src/MachOReaderDylib.hpp: recognize $os10.6$
-       
-
------ Tagged ld64-82.2
-
-2008-01-30     Devang Patel    <dpatel@apple.com>
-
-       <rdar://problem/5714833> Can't build 64-bit Intel binaries with LTO
-       <rdar://problem/5714787> ld64 fails to build with llvm-gcc-4.2
-       * src/LLVMReader.hpp: Fix character count typo in strncmp call.
-       Use const char * to initialize temp. string.
-       * ld64.xcodeproj/project.pbxproj: use $(DEVELOPER_DIR) in header search construction
-       instead of hard coding /Developer.
-       
------ Tagged ld64-82.1
-
-2008-01-23     Nick Kledzik    <kledzik@apple.com>
-
-       * src/MachOReaderRelocatable.hpp: don't bus error if S_LITERAL_POINTERS is missing relocs
-       
-
-2008-01-22     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5695496> ld uses 32-bits in some places to hold addresses when parsing 64-bit mach-o files
-       * src/MachOReaderRelocatable.hpp: use AddrToAtomMap type that switch address to 64-bits for 64-bit archs
-       * src/MachOWriterExecutable.hpp: verify BR14 does not overflow for external relocs
-       * unit-tests/test-cases/relocs-c: update test case to slide addresses to verify x86_64 .o files
-
-       
------ Tagged ld64-82
-       
-2008-01-18     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5694612> Bad grammar used in ld warning: cannot exported hidden symbol
-       * src/ld.cpp: fix typo in warning string
-       
-
-2008-01-16     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5565074> Bundle Loader does not work anymore when loader is a bundle
-       <rdar://problem/5590203> ld warns of incorrect architecture when linking a bundle to a bundle
-       * src/MachOReaderDylib.hpp: support linking against bundles via -bundle_loader. Clean up error messages
-       * unit-tests/test-cases/bundle_loader: update test case
-               
-       
-2008-01-16     Nick Kledzik    <kledzik@apple.com>
-       
-       <rdar://problem/5366363> ld -r -x creates debug notes (stabs) when it should not with -x (keep only global symbols)
-       * src/Options.cpp: in reconfigureDefaults() if -r and -x then -S
-       
-
-2008-01-16     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5566068> if ld crashes while writing output file, it should delete the half written file
-       * src/MachOWriterExecutable.hpp: wrap open/write/close in try block and add signal handlers all to delete
-       output file on failure.
-       
-
-2008-01-16     Devang Patel    <dpatel@apple.com>
-
-       * src/LLVMReader.hpp: Use __gnu_cxx::hash_map instead of hash supported by LLVM.
-
-
-2008-01-16     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5593537> GC-supported library can't be linked into GC-required executable
-       * src/ld.cpp: loosen constraint that all objc code must be compiled with same GC settings and
-       allow gc-compatible code to be linked into anything.
-       * unit-tests/test-cases/objc-gc-checks: update test case
-
-
-2008-01-15     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5687976> no debug notes for custom named data
-       * src/ld.cpp: in synthesizeDebugNotes() check getSymbolTableInclusion() instead of for leading underscore
-       * unit-tests/test-cases/dwarf-debug-notes: update test case
-       
------ Tagged ld64-81.5
-
-2008-01-14     Devang Patel    <dpatel@apple.com>
-
-       <rdar://problem/5683813> llvm-gcc-4.2 fails to build Sqlite 3.5.4 with -O4
-       * src/LLVMReader.hpp: Resolve proxy references. Collect new unbounded references 
-       after optimization.
-       * src/ld.cpp: Resolve additional unbounded references after optimization.
-       
-
-2008-01-14     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5655246> PPC Leopard (Xcode 3.0) linker ld gets "Bus error" sometimes
-       * src/MachOReaderRelocatable.hpp: use same code as x86 to parse ppc and arm sect-diff relocs
-       * src/MachOWriterExecutable.hpp:  use same code as x86 to write ppc and arm sect-diff relocs
-       
-
-2008-01-11     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5637618> PPC Leopard (Xcode 3.0) linker ld reports "unknown scattered relocation type 4"
-       * src/MachOReaderRelocatable.hpp: add PPC_RELOC_HI16 to scattered reloc parsing
-       * unit-tests/test-cases/relocs-asm/relocs-asm.s: added tests for scattered hi/lo instructions
-       
-
-2008-01-11     Nick Kledzik    <kledzik@apple.com>
-
-       * doc/man/man1/ld.1: add doc for -no_implicit_dylibs, -read_only_stubs, -slow_stubs, -interposable_list
-       
-       
-2008-01-11     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4800212> ld64(1) man page uses ambiguous term "suffix"
-       * doc/man/man1/ld.1: make meaning of "suffix" more explicit
-       
-
-2008-01-11     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5633081> Obj-C Symbols in Leopard Can't Be Weak Linked
-       * src/MachOWriterExecutable.hpp: set weak and lazy attributes on dummy .objc_class_name undefines
-        to dylibs to support Mac OS X 10.3.x dyld
-        
-
-2008-01-11     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5669751> Unknown error with linker (dyld: unknown external relocation type)
-       * src/ld.cpp: fix crash when SO stabs are not balanced
-       
-
-2008-01-11     Devang Patel    <dpatel@apple.com>
-
-       <rdar://problem/5667433> LTO does not work if expected output is a dynamic library
-       * src/LLVMReader.hpp: Supply arguments describing output kind to optimizer. Communicate
-       visibility info.
-
-2000-01-10     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5680988> __cls_refs section is losing S_LITERAL_POINTERS section type
-       * src/MachOWriterExecutable.hpp: special case __cls_refs section 
-       * unit-tests/test-cases/objc-literal-pointers: add test case
-
-
-2008-01-03     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5667688> wrong EH information might be used
-       Created new kGroupSubordinate reference kind to model group comdat.  The "signature" atom
-       has kGroupSubordinate references to the other atoms in the group.  If the signature atom
-       is coalesced away, the linker follows kGroupSubordinate references and throws away the
-       other members of the group.
-       * unit-tests/test-cases/eh-coalescing: added test case
-       * src/ld.cpp: added markDead() and use propagate to subordinates
-       * src/Architectures.hpp: added kGroupSubordinate
-       * src/MachOReaderRelocatable.hpp: add kGroupSubordinate reference from a function to its .eh atom
-         and if used, from .eh atom to its LSDA atom.
-       * src/MachOWriterExecutable.hpp: handle kGroupSubordinate like kNoFixUp
-
------ Tagged ld64-81.4.1
-
-2007-12-19     Devang Patel    <dpatel@apple.com>
-
-       * src/LLVMReader.hpp: Add LLVM_LTO_VERSION #ifdef check.
-       
-2007-12-19     Devang Patel    <dpatel@apple.com>
-
-       * src/LLVMReader.hpp: Add fOptimizer NULL check before calling printVersion().
-       
-2007-12-19     Devang Patel    <dpatel@apple.com>
-
-       <rdar://problem/5655956> print LLVM LTO version number in verbose mode
-       * src/LLVMReader.hpp: Add printLLVMVersion() to print llvm version string in verbose mode.
-       * src/Options.cpp: Use printLLVMVersion() in verbose mode.
-
-2007-12-19     Devang Patel    <dpatel@apple.com>
-
-       <rdar://problem/5655956> print LLVM LTO version number in verbose mode
-       * src/Options.h: Add verbose() method to check fVerbose flag.
-       * src/LLVMReader.hpp: Print LLVM version string in verbose mode.
-       
------ Tagged ld64-81.4
-
-2007-12-18     Devang Patel    <dpatel@apple.com>
-
-       * src/LLVMReader.hpp: Invalidate input architecture when optimizer is not available.
-
------ Tagged ld64-81.3
-
-2007-12-17     Nick Kledzik    <kledzik@apple.com>
-
-       * ld64.xcodeproj/project.pbxproj: remove extraneous header search paths
-       
-
-2007-12-17     Devang Patel    <dpatel@apple.com>
-
-       * src/LLVMReader.hpp: Do not throw exception if LLVMReader is not able to
-       dlopen LTO library. Instead just flag input file as an invalid LLVM bitcode file.
-
-
-2007-12-14     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5645908> gcc DejaGnu failure: gcc.dg/20020312-2.c (test for excess errors) (-fstack-protector-all)
-       * src/MachOWriterExecutable.hpp: fix Writer<x86>::generatesExternalTextReloc() to allow text relocs
-       * unit-tests/test-cases/read-only-relocs: updated test case to link a dynamic main executable compiled with -static
-
-
-2007-12-14     Devang Patel    <dpatel@apple.com>
-
-  <rdar://problem/5648438> Enable Link Time Optimization in Opal
-  * src/LLVMReader.hpp: Locate LLVMlto.dylib relative to ld location in Developer folder.
-  * ld64.xcodeproj/project.pbxproj: Add {DEVELOPER_DIR}/usr/include in header search path.
-  * unit-tests/run-all-unit-tests: Set DYLD_FALLBACK_LIBRARY_PATH to find LLVMlto.dylib during unit testing.
-  * unit-tests/testcases/llvm-integration/Makefile: Point LLVMGCC and LLVMGXX to llvm-gcc-4.2 in Developer folder during unit testing.
-  
-  
-2007-12-13     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5645446> SWB: failures due to ld: pointer in read-only segment not allowed in slidable image, used in ...
-       * src/MachOReaderRelocatable.hpp: in Reader<x86>::addRelocReference() handle weak pc-rel 32-bit vanilla relocs properly
-       
------ Tagged ld64-81.2 
-
-
-
-2007-12-07     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5615298> support 8-bit relocations for i386
-       * src/Architectures.hpp: add kPCRel8
-       * src/MachOReaderRelocatable.hpp: support 8-bit pc-rel relocations for intel
-       * src/MachOWriterExecutable.hpp: support 8-bit pc-rel relocations for intel
-       * unit-tests/test-cases/relocs-asm: add test cases
-
-
------ Tagged ld64-81.1 
-
-2007-12-06     Nick Kledzik    <kledzik@apple.com>
-
-       * src/MachOReaderDylib.hpp: rework cycle detection to remove some false positives
-       
-
-2007-12-05     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5628149> Duplicate probe firings in Security.framework
-       * src/ld.cpp: check dtrace probe sites are not in fDeadAtoms before using
-       * unit-tests/test-cases/dtrace-static-probes-coalescing: add test case
-       
-
-2007-12-05     Nick Kledzik    <kledzik@apple.com>
-
-       * src/MachOReaderRelocatable.hpp: fix CFString coalescing to work with -fwritable-strings
-       * unit-tests/test-cases/cfstring-coalesce: add -fwritable-strings to test case
-
-
------ Tagged ld64-81   
-
-2007-11-15     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4196067> ld64 should support runtime text relocations
-       * src/MachOWriterExecutable.hpp: add generatesLocalTextReloc() and generatesExternalTextReloc()
-       * src/Options.cpp: process -read_only_relocs option
-       * src/Options.h: add allowTextRelocs() and warnAboutTextRelocs()
-       * src/MachOReaderRelocatable.hpp: add hasLongBranchStubs()
-       * src/machochecker.cpp: allow relocs in read only segments, if section flags are set
-       * unit-tests/test-cases/read-only-relocs: update test case
-
-
-2007-11-08    Devang Patel     <dpatel@apple.com>
-
-       * ld64.xcodeproj/project.pbxproj: add new build phase "build configure.h" for
-       ld target.
-       * src/ld.cpp: Include "configure.h"
-
-
------ Tagged ld64-80.11
-
-2008-02-12     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5741312> Wrong section name for objc info for ARM when OBJC2 is used
-       * src/MachOWriterExecutable.hpp: switch segment/section name for ARM objc2 image info
-
------ Tagged ld64-80.10
-       
-2008-02-11     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5733578> ld64 does not support -aspen_version_min 2.0
-       * src/Options.cpp: allow 2.x for -aspen_version_min
-       
-
-2008-02-11     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5733575> ld_classic: unknown flag: -aspen_version_min
-       * src/Options.cpp: change -aspen_version_min x.x to -macosx_version_min 10.5 when invoking ld_classic
-       
-
------ Tagged ld64-80.9 
-
-2008-01-29     Nick Kledzik    <kledzik@apple.com>
-       
-       <rdar://problem/5713054> -iphone_version_min ==> -aspen_version_min
-       * src/Options.cpp: support -aspen_version_min
-       
-
------ Tagged ld64-80.8 
-
-2008-01-10     Nick Kledzik    <kledzik@apple.com>
-       
-       * src/Options.cpp: support transition to new objc ABI for ARM by allowing old .objc_class_name_* 
-       style names in export files and map them to new _OBJC_CLASS_$_ style names.
-       
-
------ Tagged ld64-80.7 
-
-2008-01-02     Nick Kledzik    <kledzik@apple.com>
-       
-       <rdar://problem/5572168> BigBear5A18 isn't fully prebound
-       * src/Options.cpp: make fNeedsModuleTable true for arm
-
------ Tagged ld64-80.6 
-
-2007-11-30     Nick Kledzik    <kledzik@apple.com>
-       
-       <rdar://problem/5620976> -iphone_version_min
-       * src/Options.cpp: handle -iphone_version_min option
-
-
------ Tagged ld64-80.5 
-
-2007-11-26     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5601142> need to special case some dylibs in seg_addr_table
-       * src/Options.cpp: retry seg_add_table lookup for a couple of unusual dylibs
-       
-       
------ Tagged ld64-80.4 
-
-2007-11-06     Nick Kledzik    <kledzik@apple.com>
-       
-       * src/MachOReaderRelocatable.hpp: fix parsing of external and scattered thumb branch22 relocs
-       * unit-tests/test-cases/thumb-blx: add test case to keep blx issues from coming back
-
------ Tagged ld64-80.3 
-       
-2007-11-03     Nick Kledzik    <kledzik@apple.com>
-       
-       * src/MachOReaderRelocatable.hpp: remove recalc of dstAddr which could cause thumb branches to be +2
-       * src/MachOWriterExecutable.hpp: remove incorrect test for relocateableExternal
-       
------ Tagged ld64-80.2
-
-2007-11-01     Nick Kledzik    <kledzik@apple.com>
-
-       * src/ld.cpp: hack my own prototype for log2() until math.h is cleaned up
-       
-       
------ Tagged ld64-80.1
-
-2007-11-01     Nick Kledzik    <kledzik@apple.com>
-
-       * ld64.xcodeproj/project.pbxproj: add HEADER_SEARCH_PATHS for cross builds
-       * src/ld.cpp: temporarily disable LLVM_SUPPORT
-       * src/MachOWriterExecutable.hpp: Don't use CC_MD5() directly
-
-
-2007-10-26     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5556038> Cannot build with libm_static.a statically linked
-       * src/MachOWriterExecutable.hpp: Fix makesExternalRelocatableReference() for -r -d case
-       * unit-tests/test-cases/tentative-to-real-hidden: add test case
-
-
------ Tagged ld64-80
-
-2007-10-24     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4222696> linker should probably warn about trying to export a hidden symbol
-       * src/ld.cpp: if using -exported_symbols_list check each hidden atom as it is added to symbol table
-       * src/Options.h,.cpp: add hasExportMaskList()
-       * unit-tests/test-cases/exported_symbols_list-hidden: added test case
-
-
-2007-10-24     Nick Kledzik    <kledzik@apple.com>
-
-       * src/MachOWriterExecutable.hpp: keep old style dtrace probes externel for kernel builds
-       
-
-2007-10-23     Nick Kledzik    <kledzik@apple.com>
-       
-       <rdar://problem/4556199> unify error and warning messages
-       <rdar://problem/5546450> -w should suppress warnings
-       * src/ld.cpp: use warning() function
-       * src/Options.h: remove emitWarnings()
-       * src/MachOReaderDylib.hpp: use warning() function
-       * src/MachOReaderRelocatable.hpp: use warning() function
-       * src/Options.cpp: use and implement warning()
-       * src/MachOWriterExecutable.hpp: use warning() function
-       * unit-tests/test-cases/visibility-warning: verify -w suppresses warnings
-
-
-2007-10-23     Devang Patel    <dpatel@apple.com>
-
-       * src/ld.cpp: Cover arm support inside __OPEN_SOURCE__ macro check.
-       * src/LLVMReader.hpp: Cover arm support inside __OPEN_SOURCE__ macro check.
-       * src/MachOReaderDylib.hpp: Cover arm support inside __OPEN_SOURCE__ macro check.
-       * src/ObjectFile.h: Cover arm support inside __OPEN_SOURCE__ macro check.
-       * src/MachOReaderRelocatable.hpp: Cover arm support inside __OPEN_SOURCE__ macro check.
-       * src/OpaqueSection.hpp: Cover arm support inside __OPEN_SOURCE__ macro check
-       * src/MachOWriterExecutable.hpp: Cover arm support inside __OPEN_SOURCE__ macro check.
-       * src/ObjectDump.cpp: Cover arm support inside __OPEN_SOURCE__ macro check.
-       
-
-2007-10-22     Nick Kledzik    <kledzik@apple.com>
-
-       * src/Options.cpp: add support for LD_DEAD_STRIP and LD_WARN_COMMONS
-       * src/MachOReaderRelocatable.hpp: fix problem with -dead_strip of ObjC literal pointers
-
-
-2007-10-22     Nick Kledzik    <kledzik@apple.com>
-
-       * src/Options.cpp: have -static arm code link with ld_classic (for now)
-       
-
-2007-10-22     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5396826> Recognize all arm architectures
-       * src/MachOReaderRelocatable.hpp: add support for all ARM sub-types
-       * unit-tests/test-cases/cpu-sub-types: add test cases for all combinations of ARM sub-types
-
-
-2007-10-19     Nick Kledzik    <kledzik@apple.com>
-
-       * src/*: merge in arm support
-       * unit-tests/test-cases/*: fix to work for arm and thumb
-
------ Tagged ld64-79
-
-2007-10-16     Nick Kledzik    <kledzik@apple.com>
-
-       * src/MachOWriterExecutable.hpp: if -r mode, always set custom alignment (SET_COMM_ALIGN) on common symbols
-       * unit-tests/test-cases/visibility-warning-dylib-v-archive/Makefile: fix warning
-       * unit-tests/test-cases/static-executable/Makefile: fix spurious failure
-
-
-2007-10-16     Nick Kledzik    <kledzik@apple.com>
-
-       * src/MachOWriterExecutable.hpp: fix edge case in branch island generation
-
-
-2007-10-12     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5323449> Add option to create old, slow stubs for i386
-       * src/ObjectFile.h/.cpp: support -read_only_stubs
-       * src/MachOWriterExecutable.hpp: enhance StubAtom<x86> to support old style __symbol_stub/__la_symbol_ptr stubs
-       * unit-tests/test-cases/slow-x86-stubs: add test case
-
-
-2007-10-12     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5427952> ld64's re-export cycle detection logic prevents use of X11 libGL on Leopard
-       * src/Options.cpp: in findFileUsingPaths() don't search for embedded dylibs
-       * unit-tests/test-cases/indirect-path-search/Makefile: added case for a dylib embedded in a framework
-
-
-2007-10-11     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5451987> add option to disable implicit load commands for indirectly used public dylibs
-       * src/Options.cpp: add support for -no_implicit_dylibs
-       * src/ObjectFile.h: add fImplicitlyLinkPublicDylibs
-       * src/MachOReaderDylib.hpp: test fImplicitlyLinkPublicDylibs before hoisting an implicitly linked dylib
-       * unit-tests/test-cases/implicit_dylib: add test case
-
-
-2007-10-11     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5254413> -interposable_list
-       * src/Options.h/cpp: Add fInterposeList and fInterposeMode to support -interposable_list
-       * src/MachOWriterExecutable.hpp: pass symbol name to fOptions.interposable()
-       * unit-tests/test-cases/interposable_list: add test case
-
-
-2007-10-10     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5529626> If only weak_import symbols are used, linker should use LD_LOAD_WEAK_DYLIB
-       * src/MachOWriterExecutable.hpp: automatically use LC_LOAD_WEAK_DYLIB if all symbols used from a dylib are weak_import
-       * unit-tests/test-cases/weak_dylib: added test case
-
-
-2007-10-10     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5504954> linker does not error when dylib ordinal exceeds 250
-       * src/MachOWriterExecutable.hpp: error out if ordinals exceed max allowed
-       
-
-2007-10-10     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4067110> overriding 'operator new' or 'operator delete' fails if no weak symbols are present
-       * src/ld.cpp: at end of checkUndefines() search dylibs for weak versions of any global external symbols 
-       * src/ObjectFile.h: add hasWeakExternals() method to Reader
-       * src/MachOReaderDylib.hpp: implement hasWeakExternals() method in Reader
-       * src/ExecutableFile.h: add overridesDylibWeakDefines parameter to write()
-       * src/MachOWriterExecutable.hpp: use overridesDylibWeakDefines parameter to write()
-       * unit-tests/test-cases/operator-new: add test case
-       
-
-2007-10-05     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5048861> No warning about tentative definition conflicting with dylib definition
-       <rdar://problem/5132652> .comm variables in shared library, worked with XCode 2.4.1, broken with XCode 3?
-       * src/ld.cpp: at end of checkUndefines() verify if any remaining commons conflict with dylibs
-       * doc/man/man1/ld.1: document -commons and -warn_commons options
-       * unit-tests/test-cases/tentative-and-dylib: added test case
-
-
-2007-10-05     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5346331> NS/CFString constants are not dead strippable
-       * src/MachOReaderRelocatable.hpp: break up __cfstring section into one atom per cfstring, make them coalesable
-       * unit-tests/test-cases/cfstring-coalesce: added test case
-
-
-2007-10-05     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5524973> Dead stripping + exported symbols list using wildcards doesn't seem to do the right thing
-       * src/Options.cpp/h: add hasWildCardExportRestrictList()
-       * src/ld.cpp: if dead stripping code and have wildcard exports, add all global atoms matching wildcards as roots
-       * unit-tests/test-cases/exported-symbols-wildcards-dead_strip: added test case
-
-
-2007-10-04     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5433882> ld shouldn't search /Network/Library/Frameworks by default
-       * src/Options.cpp: remove /Network/Library/Frameworks/ from default search path
-       * doc/man/man1/ld.1: document the change
-       
-
-2007-10-04     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5341567> all binaries should get LD_UUID load commands, not just those with DWARF symbols
-       * src/ld.cpp: default fCreateUUID to be true for non object file output types
-       * unit-tests/test-cases/no-uuid/Makefile: update test case to match new rules
-
-
------ Tagged ld64-78
-
-2007-09-27     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5476313> range check load commands
-       * src/MachOReaderDylib.hpp: check that load commands all fit in load command size from header
-       * src/MachOReaderRelocatable.hpp: check that load commands all fit in load command size from header
-
-
-2007-09-27     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5433355> Xc8M2540a: ld64 crashes when linking Pascal program
-       * src/ld.cpp: fix findAtomAndOffset() to handle where there are no function atoms 
-
-
-2007-09-27     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5241179> ADOBE Xcode 3: ld -dead_strip does not work with -init from an archive
-       * src/ld.cpp: add bool parameter to entryPoint() so -init atom not looked for too soon
-       * unit-tests/test-cases/dead_strip-init-archive: added test case
-       
-
-2007-09-26     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5459546> Spurious link warnings for inline members of C++ template classes
-       * src/ld.cpp: check definition kinds before warning about visibility mismatches
-       * unit-tests/test-cases/visibility-warning: added test case
-       
-
-2007-09-26     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5394172> an empty .o file with zero load commands will crash linker
-       * src/MachOReaderRelocatable.hpp: have Reader constructor return early of no load commands
-       * unit-tests/test-cases/empty-object: added test case
-       
-       
-2007-09-26     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5453384> 9a527: ppc64 branch islands fail with 4GB pagezeo
-       * src/MachOWriterExecutable.hpp: start range calculations at start of __text not at zero.
-       
-
------ Tagged ld64-77 (Xcode 3.0)
-
-2007-07-23     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5351380> Kernel is linked with some global symbols unsorted
-       * src/MachOWriterExecutable.hpp: Add NListNameSorter to allow global atoms and extra labels to be sorted
-
-
-2007-07-20     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5254468> Can't do objc_msgSendSuper dispatches after loading a Fix&Continue bundle
-       * src/MachOWriterExecutable.hpp: when calculating what kind of reloc to use, never use an 
-         external reloc to reference 32-bit ObjC symbols.
-
-
-2007-07-20     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5349847> Runtime crash with ICC math library on Leopard
-       * src/MachOReaderRelocatable.hpp: detect if section starts with a symbol that is not 
-         aligned to section and correct it.
-
-
------ Tagged ld64-76
-
-2007-06-29     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5303718> export hiding does not work for frameworks
-       * src/MachOReaderDylib.hpp: fix checks in isPublicLocation()
-       * unit-tests/test-cases/symbol-moving: update to test frameworks as well as dylibs
-
-
-2007-06-27     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5299907> linker should use undefines from flat dylibs when linking a main flat
-       * src/ObjectFile.h: added fLinkingMainExecutable
-       * src/Options.cpp: set up fLinkingMainExecutable
-       * src/MachOReaderDylib.hpp: when linking a main executable for flat namespace, the reader for
-               any loaded flat namespace dylib will have a new atoms that has references to all undefined
-               symbols in the dylib
-       * unit-tests/test-cases/flat-indirect-undefines: added test case
-       * doc/man/man1/ld.1: update man page to describe when dylib undefines are used
-       
-
-2007-06-27     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5277857> OpenGL.framework and X11 both have a libGL.dylib which can cause ld to segfault if both are found
-       * src/MachOReaderDylib.hpp: add assertNoReExportCycles() method
-       * unit-tests/test-cases/dylib-re-export-cycle: added test case
-
-
-2007-06-27     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5286462> ld64 has slightly different warning message formats than the old ld
-       * src/ld.cpp: standardize all warning messages to start with "ld: warning"
-       * src/MachOWriterExecutable.hpp: ditto
-       * src/MachOReaderRelocatable.hpp: ditto
-       * src/MachOReaderDylib.hpp:ditto
-
-
-2007-06-26     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5297034> -dead_strip can cause duplicate external commons
-       * src/ld.cpp: don't use discarded coalesced global atoms as dead strip roots
-       * src/machochecker.cpp: error if duplicate external symbols
-       * unit-tests/test-cases/commons-coalesced-dead_strip: added test case
-       
-
-2007-06-26     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4135857> update man page that linker does not search indirect libraries with two-level namespace
-       * doc/man/man1/ld.1: add new "Indirect dynamic libraries" section to man page
-       
-
-2007-06-26     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5285473> Xc9A466: Exports file cannot use Mac line ends
-       * src/Options.cpp: check for \r or \n when parsing .exp files
-       * unit-tests/test-cases/exported_symbols_list-eol: added test case
-       
-
------ Tagged ld64-75
-
-2007-05-31     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4607755> Simplier, generalized way to re-export dylibs: LC_REEXPORT_DYLIB
-       * src/MachOWriterExecutable.hpp: Use LC_REEXPORT_DYLIB when targetting 10.5
-
-
------ Tagged ld64-74.5
-
-2007-05-31     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5241902> set OSO timestamp to zero for when building in buildit
-       * src/ld.cpp: check for RC_RELEASE and if exists set all OSO timestamps to zero
-       
-
-2007-05-30     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5224676> BUILD_STABS now causes ld of xnu to bus error
-       * src/ld.cpp: Change || to && in collectStabs()
-
-
------ Tagged ld64-74.4
-
-2007-05-18     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5211667> static probes don't work with libraries in dyld shared cache
-       *  src/OpaqueSection.hpp: the __TEXT segment is executable
-
-
------ Tagged ld64-74.3
-
-2007-05-16     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5201463> ppc: linker adds stubs to cstring references
-       * src/MachOWriterExecutable.hpp: update ppc stubableReference() to only allow high/low references
-               to be stubed if they reference a symbol in some other dylib.
-       * unit-tests/test-cases/stub-generation: added test case
-       
-
-2007-05-16     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5008421> ppc64: need to make LOCAL indirect symbol table entry for now local symbol
-       * src/MachOWriterExecutable.hpp: factored local tests into indirectSymbolIsLocal()
-       * unit-tests/test-cases/non-lazy-r: added test case
-       
-
-2007-05-15     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5198807> ld64 drops fix&continue bit in __OBJC, __image_info.
-       * src/MachOReaderRelocatable.hpp: implement objcReplacementClasses()
-       
-
-2007-05-15     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5066152> support __image_info in __DATA segment for 64-bits
-       * src/MachOReaderRelocatable.hpp: use strncmp() for __objc_imageinfo since it is 16 bytes long
-       * src/MachOWriterExecutable.hpp: specialize segment/section names for synthesized objc image info section
-
-
-2007-05-15     Nick Kledzik    <kledzik@apple.com>
-
-       * unit-tests/include/common.makefile: set COMPILER_PATH so harness works with latest compiler
-
-
------ Tagged ld64-74.2
-
-2007-05-11     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5195447> ld64-74.1 breaks libstdc++ DejaGnu test (G5 only)
-       * src/MachOWriterExecutable.hpp: don't stub a reference if the target offset is non-zero
-       
-
------ Tagged ld64-74.1
-
-2007-05-09     Nick Kledzik    <kledzik@apple.com>
-       
-       * src/Options.h: add emitWarnings()
-       * src/Options.cpp: wire up -w to emitWarnings()
-
-
-2007-05-09     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5137285> ld64 won't link wine (regression from Tiger)
-       * src/Architectures.hpp: add x86::kPointerDiff16 and x86::kPCRel16
-       * src/MachOReaderRelocatable.hpp: add support to parse new relocs
-       * src/MachOWriterExecutable.hpp: add support fo new relocs
-       
-
-2007-05-08     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5182537> need way for ld and dyld to see different exported symbols in a dylib
-       * src/MachOReaderDylib.hpp: update parse and use $ld$ symbols
-       * src/Options.h: move VersionMin to ReaderOptions
-       * src/ObjectFile.h: move VersionMin to ReaderOptions
-       * src/Options.cpp:  move VersionMin to ReaderOptions
-       * src/MachOWriterExecutable.hpp: move VersionMin to ReaderOptions
-       * unit-tests/test-cases/symbol-moving: added test case
-       
-
-2007-05-03     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5181105> typo in error message for linking -pie
-       * src/MachOWriterExecutable.hpp: fix typo in error messages
-       
-
------ Tagged ld64-74
-
-2007-05-03     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5171880> ld64 can't find @executable _path relative dylibs from our umbrella frameworks
-       <rdar://problem/4019497> ld64 should handle linking against dylibs that have @loader_path based dylib load commands
-       * src/ObjectFile.h: add from parameter to findDylib()
-       * src/MachOReaderDylib.hpp: supply from parameter to findDylib()
-       * src/ld.cpp: use from parameter for @loader_path substitution in findDylib()
-       * unit-tests/test-cases/re-export-relative-paths: added test case
-       
-
-2007-05-02     Nick Kledzik    <kledzik@apple.com>
-
-       * src/ObjectFile.h: add fLogObjectFiles and fLogAllFiles
-       * src/Options.cpp: hook up -t to fLogAllFiles and -whatsloaded to fLogObjectFiles 
-       * src/MachOReaderDylib.hpp: log if fLogAllFiles
-       * src/MachOReaderRelocatable.hpp: log if fLogObjectFiles or fLogAllFiles 
-       * src/MachOReaderArchive.hpp: log if fLogAllFiles
-       * doc/man/man1/ld.1: update man page
-
-
-2007-05-02     Nick Kledzik    <kledzik@apple.com>
-       
-       <rdar://problem/5177848> typo in message, frameowrk
-       * src/Options.cpp: fix typo
-
-
-2007-05-01     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4977301> "ld" man page is missing the description for many options 
-       * doc/man/man1/ld.1: add documentation on all obsolete options
-       
-       
-2007-05-01     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5113424> ld doesn't handle -mlong-branch .o files that have had local symbols stripped
-       <rdar://problem/4965359> warning about dwarf line info with -mlong-branch
-       * src/MachOReaderRelocatable.hpp: don't lop -mlong-branch stubs off end of functions
-       * src/MachOWriterExecutable.hpp: allow code references besides BR24 to be stubable
-       
-
-2007-04-30     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5065659> unable to link VTK because __textcoal_nt too large
-       * src/MachOReaderRelocatable.hpp: when doing a final link map __textcoal_nt to __text
-
-
-2007-04-30     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5062685> ld does not report error when -r is used and exported symbols are not defined.
-       <rdar://problem/4637139> ld leaves global common symbols not in exported symbols list.
-       * src/ld.cpp: stop special casing -r mode in checkUndefines() 
-       * src/MachOWriterExecutable.hpp: don't create proxy atom in -r mode if it is supposed to be exported.
-               mark tentative definitions are private extern in -r mode even without -keep_private_externs
-       * unit-tests/test-cases/exported_symbols_list-r: added test case
-
-
-2007-04-27     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5137732> ld should keep looking when it finds a weak definition in a dylib
-       * src/ld.cpp: modified addJustInTimeAtoms() to keep looking when a weak defintion is found
-       * unit-tests/test-cases/weak-def-ordinal: added test case
-       
-
-2007-04-27     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5166572> better error message for indirect dylibs missing required architecture
-       * src/ld.cpp: when loading indirect dylib add path to error messages
-
-
-2007-04-25     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5109373> the i386 slice of dyld does not need __IMPORT segment
-       * src/ObjectFile.h: add fForDyld
-       * src/Options.cpp: set up fForDyld
-       * src/MachOReaderRelocatable.hpp: if fForDyld, change __IMPORT segment to __DATA
-       * src/MachOWriterExecutable.hpp: recognize __DATA/__pointers in dyld as a non-lazy section
-
-
-2007-04-24     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5008421> ppc64: need to make LOCAL indirect symbol table entry for now local symbol
-       * src/MachOWriterExecutable.hpp: use INDIRECT_SYMBOL_LOCAL for any non-global symbol
-       * unit-tests/test-cases/strip_local: update test case
-       
-       
-2007-04-24     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5150407> ld64 -sectorder and -order_file files don't accept white space following the :
-       * src/Options.cpp: prune white space after colon and before symbol name
-       * unit-tests/test-cases/order_file: update test case to have a space after the colon
-       
-
-2007-04-24     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5055233> ld64 corrupts debug symbol table entries, nm doesn't print them
-       * src/MachOWriterExecutable.hpp: properly set ilocalsym in module table
-
-
-2007-04-24     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5066152> support __image_info in __DATA segment for 64-bits
-       * src/MachOReaderRelocatable.hpp: look for new objc info section name too
-
-
-2007-04-24     Nick Kledzik    <kledzik@apple.com>
-       
-       * src/MachOWriterExecutable.hpp: fix -non_global_symbols_strip_list to work with -r
-       * unit-tests/test-cases/local-symbol-partial-stripping: update test case
-
-
-
------ Tagged ld64-73.7
-
-2007-05-10     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5194804> can't use dtrace static probes in x86_64 dylib
-       * src/MachOWriterExecutable.hpp: x86_64:kPointerDiff32 is ok in shared region
-       * unit-tests/test-cases/dtrace-static-probes: update to build dylib too
-
-
-2007-05-09     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5191610> 9A430: using -dead_strip with static dtrace probes causes ld to crash
-       * src/ld.cpp: fix markLive() to look at right name in dtrace probe refernce
-       * unit-tests/test-cases/dtrace-static-probes: added -dead_strip case
-
-
------ Tagged ld64-73.6
-
-2007-04-17     Nick Kledzik    <kledzik@apple.com>
-       
-       <rdar://problem/5140897> Add options to do partial stripping of local symbols
-       * src/MachOWriterExecutable.hpp: use fOptions.keepLocalSymbol()
-       * src/Options.cpp: implement -non_global_symbols_no_strip_list and -non_global_symbols_strip_list
-       * src/Options.h: replace stripLocalSymbols() with localSymbolHandling() and keepLocalSymbol()
-       * doc/man/man1/ld.1: document -non_global_symbols_no_strip_list and -non_global_symbols_strip_list
-       * unit-tests/test-cases/local-symbol-partial-stripping: added test case
-       
-
------ Tagged ld64-73.5
-
-2007-04-17     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5129379> ld64-73.3 XBS logging incorrectly reporting "direct" dynamic libraries
-       * src/ld.cpp: restore direct vs indirect library for LD_TRACE_DYLIBS logging
-       
-
-2007-04-16     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5067034> data initialized to a weak imported symbol is missing relocation
-       * src/MachOWriterExecutable.hpp: check for A::kPointerWeakImport in buildExecutableFixups()
-       * unit-tests/test-cases/weak_import: updated test case to catch this problem
-
-
-2007-04-13     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5071047> Support -U 
-       * src/MachOWriterExecutable.hpp: create proxies for -U symbols
-       * src/Options.cpp: process -U 
-       * src/Options.h: add allowedUndefined() and someAllowedUndefines()
-       * src/ld.cpp: create proxies for -U symbols
-       * doc/man/man1/ld.1:  document -U and -undefined options
-       * unit-tests/test-cases/undefined-dynamic-lookup: added test case
-
-
------ Tagged ld64-73.4
-
-2007-04-12     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5125280> ld changes needed to support read-only DOF
-       * src/Options.cpp: remove -read_only_dof
-       * src/Options.h: remove fReadOnlyDOFs
-       * src/ld.cpp: only generate read-only DOF sections
-       
-
------ Tagged ld64-73.3.1
-
-2007-04-13     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5130496> -framework vecLib -framework Accelerate causes bad ordinals 
-       * src/MachOWriterExecutable.hpp: fix bug optimizeDylibReferences() when there are two readers with same install name
-
-
------ Tagged ld64-73.3
-
-2007-04-03     Nick Kledzik    <kledzik@apple.com>
-
-       * src/ld.cpp: read-only-dofs should use 32-bit offsets for x86_64
-       * src/MachOReaderDylib.hpp: if "public" re-export is not marked implict, still mark it as re-exported
-       
-
-2007-04-02     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5105971> if replacement file for -dylib_file is missing, warn instead of error
-       * src/ld.cpp: a try/catch to turn -dylib_file error into a warning.
-       * unit-tests/test-cases/dylib_file-missing: add test case
-       * doc/man/man1/ld.1: update man page about -dead_strip_dylibs
-       
-
------ Tagged ld64-73.2
-
-2007-03-31     Nick Kledzik    <kledzik@apple.com>
-       
-       <rdar://problem/5102873> ld64-73: atom sorting error with duplicate zero sized bss symbols
-       * src/MachOReaderRelocatable.hpp: suppress warning on sorting zero size zero fill atoms
-       
-2007-03-31     Nick Kledzik    <kledzik@apple.com>
-       
-       <rdar://problem/5102845> ld64-73 fails anything linking with -lm
-       * src/ld.cpp: when processing dylbs that are sylinks ensure that fDylibMap contains all paths  
-       * src/MachOWriterExecutable.hpp: when dead stripping dylibs and renumbering ordinals make sure
-               aliases dylib get renumbered too
-       * unit-tests/test-cases/dylib-aliases: added
-       
-       
------ Tagged ld64-73.1
-       
-2007-03-30     Nick Kledzik    <kledzik@apple.com>
-
-       * src/MachOWriterExecutable.hpp: back out use of LC_REEXPORT_DYLIB until rdar://problem/5009909 is in build fleet
-       
-       
------ Tagged ld64-73
-       
-2007-03-30     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4175790> ER: -dead_strip_dylibs
-       <rdar://problem/3904828> linker should add implicit load commands for indirectly used public dylibs
-       * src/ObjectFile.h: change dylib reader interface to implictly/explicitlyLinked
-       * src/ld.cpp: use new dylib reader interface
-       * src/Options.h: add deadStripDylibs()
-       * src/Options.cpp: support -dead_strip_dylibs
-       * src/MachOReaderDylib.hpp: use new dylib reader interface
-       * src/MachOWriterExecutable.hpp: remove dylib load commands for unused dylibs and alter ordinals 
-       * unit-tests/test-cases/re-export-optimizations: added
-       * unit-tests/test-cases/dead_strip_dylibs: added
-       
-
-2007-03-30     Nick Kledzik    <kledzik@apple.com>
-
-       * src/Options.cpp: enable -lfoo to search for libfoo.so as well as libfoo.dylib, 
-               remove seg addr table hack for transitioning to new linker
-
-2007-03-30     Nick Kledzik    <kledzik@apple.com>
-       
-       <rdar://problem/5073800> ADOBE XCODE3: Linker is slow with large C++ .o files
-       * src/MachOReaderRelocatable.hpp: the compiler generates stubs to weak functions in the
-               same translation unit.  Don't treat those like the spurios stubs to static functions.
-
-
-2007-03-29     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4739044> ld64 should link mach_kernel during xnu builds to support dtrace
-       * src/MachOReaderRelocatable.hpp: To handle duplicate labels properly, rework how atoms sizes are set 
-               by iterating through sorted fAtoms rather than fAddrToAtom, . Change default alignment of commons
-               to be the natural alignment of the size rounded up to the closest power of two and max it at 12.
-               Build atoms in reverse symbol table order so that global atoms are constructed before locals.
-               This assures that if there is a global and local label at the same location, the global label
-               will become the atom's name and the local will be an alias.  Properly handle a label
-               at the end of a section.  Handle R_ABS in relocations.  Handle sect-diff relocs with addends.
-               Don't auto-strip 'l' symbols in static executables (mach_kernel).
-       * src/OpaqueSection.hpp:  opaque_section now has an ordinal
-       * src/ld.cpp: opaque_section now requires an ordinal
-       * src/ObjectFile.h: add ReaderOptions.fForStatic
-       * src/Options.cpp: set fForStatic when building a static executable
-       * src/MachOWriterExecutable.hpp: add from atom to StubAtom<ppc>.  Properly write out i386
-               sect-diff relocs with addends.  properly write out ppc PICbase relocs where pic base
-               is not in the atom.
-
-
-2007-03-27     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5085863> Typo in ld man page (-exported_symbols_list)
-       * doc/man/man1/ld.1: fix typo
-       
-
-2007-03-26     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4727750> consider generating LC_UUID from a checksum of the file
-       * src/Options.h: change emitUUID() to getUUIDMode()
-       * src/Options.cpp: support -random_uuid
-       * src/MachOWriterExecutable.hpp: set uuid to be md5 hash of entire output file
-       
-
-2007-03-24     Nick Kledzik    <kledzik@apple.com>
-       
-       * src/MachOWriterExecutable.hpp: restructure writeAtoms() to copy all atoms in memory if possible
-
-
-2007-03-24     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5082603> ld -r of stripped .o file can incorrectly merge non-lazy pointers
-       * src/MachOWriterExecutable.hpp: when generating a .o file, non-lazy pointer with target offsets should be
-               encoded as LOCAL in the indirect symbol table
-       * unit-tests/test-cases/stripped-indirect-symbol-table: added test case
-
-
-2007-03-23     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5084564> SWB: ld64-72 errors building with gcc-4.2      
-       * src/MachOReaderDylib.hpp: add curly brackets in switch cases
-       * src/MachOWriterExecutable.hpp: rearrange classes so there are no template specialization forward references
-
-
-2007-03-23     Nick Kledzik    <kledzik@apple.com>
-
-       * src/ld.cpp: fix -print_statistics when using -dead_strip
-
-
-2007-03-23     Nick Kledzik    <kledzik@apple.com>
-
-       * src/MachOReaderRelocatable.hpp: generate better names for non-lazy pointers to the interior of atoms
-
-
-2007-03-16     Nick Kledzik    <kledzik@apple.com>
-
-       * src/MachOWriterExecutable.hpp: speed up ld -r a little by reversing relocs en mas
-
-
-2007-03-16     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4975277> ld Bus Error on missing command line arguments
-       * src/Options.cpp: check next argv[] is not NULL
-
-
-2007-03-16     Nick Kledzik    <kledzik@apple.com>
-       
-       <rdar://problem/4832049> need to be able to order symbols in anonymous namespaces
-       * src/ld.cpp: add logic to do fuzzy matching of symbols with anonymous namespace usage
-       * unit-tests/test-cases/order_file-ans: added test case
-
-
-2007-03-16     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5042552> headerpad_max_install_names deprecated for 64-bit
-       * src/ld.cpp: make sure dylib load command order matches command line order
-       * src/Options.h: add maxMminimumHeaderPad()
-       * src/Options.cpp: add maxMminimumHeaderPad() set by -headerpad_max_install_names
-       * src/src/MachOWriterExecutable.hpp: check maxMminimumHeaderPad()
-       * doc/man/man1/ld.1: update man page about -headerpad_max_install_names
-
-
-2007-03-16     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4592484> Linker returns success although exported symbols are undefined.
-       * src/ld.cpp: turn missing symbols back into an error
-
-
-2007-03-16     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4019497> ld64 should handle linking against dylibs that have @loader_path based dylib load commands
-       * unit-tests/test-cases/loader_path: added test case
-       
-
-2007-03-16     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/3904828> linker should add implicit load commands for indirectly used public dylibs
-       <rdar://problem/4142277> Indirect libraries should be found using -F and -L options
-       <rdar://problem/4607755> Simplier, generalized way to re-export dylibs: LC_REEXPORT_DYLIB
-       * src/ld.cpp: reworked all dylib processing.  Readers can now add the dylib list.
-       * src/Options.h: add findFileUsingPaths()
-       * src/MachOReaderDylib.hpp: look in re-exported children instead of requring linker to do that
-       * src/ObjectFile.h: add processIndirectLibraries(), remove getDependentLibraryPaths()  
-       * src/machochecker.cpp: support LC_REEXPORT_DYLIB
-    * src/ExecutableFile.h: simplify DyLibUsed
-       * src/Options.cpp: add findFileUsingPaths().  add new re-export options
-       * src/MachOWriterExecutable.hpp: Use LC_REEXPORT_DYLIB when targetting 10.5
-       * doc/man/man1/ld.1: updated with new re-export options
-       * unit-tests/test-cases/indirect-path-search: added tests that -F and -L work with indirect dylibs
-       * unit-tests/test-cases/re-export-cases: added tests for all combinations of re-exporting
-       
-
-2007-03-14     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4982400> sort external relocations to optimize dyld performance 
-       * src/MachOWriterExecutable.hpp: added ExternalRelocSorter
-       * src/machochecker.cpp: verify external relocations are grouped by symbol number
-       * unit-tests/test-cases/external-reloc-sorting: added test case
-       
-       
------ Tagged ld64-72
-
-2007-03-06     Nick Kledzik    <kledzik@apple.com>
-
-       * src/Options.cpp: ignore .objc_category_name_* symbols in .exp files
-       
-
-2007-03-06     Nick Kledzik    <kledzik@apple.com>
-
-       * src/Options.cpp: stop special casing mach_kernel and instead requre kernel to be built with -new_linker 
-       
-
-2007-03-06     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5044253> ld64-72 (experimental) is causing DejaGnu test failures
-       * src/MachOWriterExecutable.hpp: add optimizableGOTReferenceKind() to track GOT uses that cannot be optimized
-
-
-2007-03-06     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5026135> minimum header padding should be 32 to allow code signing
-       * src/Options.cpp: initialize fMinimumHeaderPad to 32
-       * src/MachOWriterExecutable.hpp: better calculation of header padding 
-       
-
-2007-03-06     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5033206> Linker crashes with -flat_namespace against two-level dylibs that might have re-exports
-       * src/ld.cpp: flat namespace should not allow NULL indirect readers
-
-
-2007-03-06     Nick Kledzik    <kledzik@apple.com>
-               
-       * src/MachOReaderRelocatable.hpp: don't error on S_COALESCED sections with anonymous atoms
-       * src/MachOWriterExecutable.hpp: set MH_PIE bit when linking -pie
-       * ld64.xcodeproj/project.pbxproj: don't echo environment when running unit test
-
-
-2007-03-01     Nick Kledzik    <kledzik@apple.com>
-
-       * doc/man/man1/ld.1: Add descriptions to all "rarely used options"
-
-
-2007-03-01     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4971033> Remove support for Essential Symbols: Warn about use of -Sp option; remove man page entry
-       * src/Options.cpp: make -Sp obsolete
-       * doc/man/man1/ld.1: make -Sp obsolete
-       
-
-2007-03-01     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/5040314> Support -pie   
-       * src/Options.h: Add positionIndependentExecutable()
-       * src/Options.cpp: Support -pie option to set positionIndependentExecutable()
-       * src/MachOWriterExecutable: if -pie is used, add extra local relocations and error if any
-               absolute addressing is used
-               
-
-2007-03-01     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4739044> ld64 should link mach_kernel during xnu builds to support dtrace
-       * src/ld.cpp: Ensure segments are laid out in discovery order.  Add support for kAbsoluteSymbol.
-                       Warn when merging symbols of different visiblity.  Warn when a tentative definition 
-                       is replaced by one a real definition with a smaller size.  Lay out __common section
-                       so that ones built with -fno-commons come before regular commons.
-       * src/ObjectFile.h: remove SegmentOffset ivar and getter/setters
-       * src/machochecker.cpp: allow images with no r/w segments
-       * src/MachOReaderRelocatable: Add AbsoluteAtom.  Sort tentative definitions by name instead of by size
-                       Add support for custom commons alignment.  
-       * src/Options.cpp: Fix spurious -sectalign warnings.  Don't use ld_classic when linking mach_kernel
-       * src/MachOWriterExecutable.hpp: Support kAbsoluteSymbol atoms. In -r mode, set custom alignment 
-                       for commons if alignment is not its size.  Support global __dtrace_probe labels.
-       * src/ObjectDump.cpp: add support for kAbsoluteSymbol atoms.
-       * unit-tests/test-cases/commons-alignment: Added test case for custom commons alignment
-       * unit-tests/test-cases/absolute-symbol: Added test case for basic absolute symbols
-       * unit-tests/test-cases/segment-order: Added test case that segments lay out in discovery order
-       * unit-tests/test-cases/commons-order: Added test case that commons lay out correctly
-       * unit-tests/test-cases/end-label: Added test case that a label used to mark the end of a section does not
-                       get associcated with the next section.
-       
-
-2007-02-23     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/3965017> gcc-5005: DejaGnu failures due to -frepo
-       * src/ld.cpp: Add quotes to referenced from name to make collect2 and -frepo happy
-       
-
-2007-02-22     Nick Kledzik    <kledzik@apple.com>
-
-       * src/MachOWriterExecutable.hpp: rework how padding after load commands is calculated
-
-
-2007-02-21     Nick Kledzik    <kledzik@apple.com>
-
-       * src/MachOWriterExecutable.hpp: extend special case of __mh_execute_header to static executables too
-
-
-2007-02-21     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/3882294> gcc link map option ( "-M" ) should be redirectable to file
-       * doc/man/man1/ld.1: added -map option description
-       * src/Options.h: added generatedMapPath()
-       * src/Options.cpp: set up generatedMapPath() if -map option is used
-       * src/MachOWriterExecutable.hpp: add writeMap() method to generate map file
-
-
-2007-02-19     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4557734> Implement GOT Load elimination optimization
-       * src/ld.cpp: track size of all atoms and if > 2GB sort large zero-fill atoms to end
-       * src/MachOWriterExecutable.hpp: If image size < 2GB, only generate GOT entries if value must be
-       updatable by dyld.  If > 2GB, only eliminate GOT entries to non-zero-fill atoms.  Any use
-       of an eliminated GOT entry has its code changed from MOVQ _foo@GOT(%rip) to LEAQ _foo(%rip).
-       * unit-tests/test-cases/large-data: added
-       * unit-tests/test-cases/got-elimination: added
-
-
------ Tagged ld64-71.2
-
-2007-02-13     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4995303> new ld ignores -segprot option
-       * src/Options.h: expose customSegmentProtections()
-       * src/Options.cpp: parse -segprot option and populate customSegmentProtections()
-       * src/MachOWriterExecutable.hpp: use customSegmentProtections()
-
-
-2007-02-13     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4988068> i386 -stack_addr doesn't work
-       * src/MachOWriterExecutable.hpp: use correct offset into thread state record
-
-
------ Tagged ld64-71.1
-
-2007-02-07     Nick Kledzik    <kledzik@apple.com>
-
-       * src/ld.cpp: sort __OBJC2 segment to be next to __OBJC segment
-
-
-2007-02-07     Nick Kledzik    <kledzik@apple.com>
-
-       * src/Options.cpp: change missing -seg_addr_table from an error to a warning
-
-
-2007-02-06     Nick Kledzik    <kledzik@apple.com>
-       
-       <rdar://problem/4977311> Leopard 9A357: -dylib_file broken?
-       * src/MachOWriterExecutable.hpp: remove use of fInstallPathOverride
-       * src/Options.cpp: wire up -dylib_file option 
-       * src/Options.h: remove fInstallPathOverride.  add fDylibOverrides
-       * src/ld.cpp: check dylibOverrides() for indirect libraries
-       * unit-tests/test-cases/dylib_file: add test case
-       
-
-2007-02-05     Nick Kledzik    <kledzik@apple.com>
-
-       * src/MachOReaderDylib.hpp: don't warn about zero size __image_info sections
-
-
-2007-02-04      Rick Balocca    <rbalocca@apple.com>
-       Enable the failing cases for missing command line arguments
-
-2007-02-04      Rick Balocca    <rbalocca@apple.com>
-       Make sure that all .o's are checked by ObjectDump
-       and all macho are checked by machochecker
-
-2007-02-04      Rick Balocca    <rbalocca@apple.com>
-       Fix an endian problem with machochecker
-       Fix blank-stubs Makefile
-
------ Tagged ld64-71
-
-2007-02-02      Rick Balocca    <rbalocca@apple.com>
-       blank-stubs test case: handle the case of a native ppc compile--this
-       sets the subtype, which must be passed to lipo
-
-2007-02-01      Rick Balocca    <rbalocca@apple.com>
-       make cpu-sub-types test more robust
-
-2007-02-01      Rick Balocca    <rbalocca@apple.com>
-       auto-arch tests were resulting in a false FAILs
-
-2007-02-01      Rick Balocca    <rbalocca@apple.com>
-       test cpu-sub-types was resulting in a false FAIL
-
-2007-02-01      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4969335> STD:VSC: c99 -o writes to file that does not have write permission
-       * src/MachOWriterExecutable.hpp: check file is writable before using it
-
-2007-02-01      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4965743> debug map (N_OSO) timestamps for object files in ranlib archive are incorrect
-       * src/MachOReaderArchive.hpp: parse modTime for .o files out of archive header
-
-2007-01-31      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4967535> 9A354: ld -all_load does *NOT* produce the same dSYM as *.o or -u
-       * src/ld.cpp: when using -all_load don't assume that all atoms have same reader
-       * unit-tests/test-cases/dwarf-archive-all_load: added
-
------ Tagged ld64-70.1
-
-2007-01-31      Nick Kledzik    <kledzik@apple.com>
-
-       * src/MachOWriterExecutable.hpp: in addObjectRelocs_powerpc() mask scattered r_address to 16-bits
-
------ Tagged ld64-70
-
-
-2007-01-30      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4810668> linker should verify GC consistency of modules being linked into library
-       <rdar://problem/4474195> Support cpu-sub-types for ppc
-       * src/ObjectFile.h: Add getObjCConstraint() and getCpuConstraint()
-       * src/MachOReaderRelocatable.hpp:  don't make atom for __image_info section, instead parse constaints
-       * src/MachOReaderDylib.hpp: look at __image_info content to get constaints
-       * src/ld.cpp: add updateContraints() and checkObjc()
-       * src/MachOWriterExecutable.hpp: add ObjCInfoAtom to sythesize __image_info content
-       
-       
-2007-01-28      Nick Kledzik    <kledzik@apple.com>
-
-       src/*: remove ObjectFile::requiresFollowOnAtom() method
-       
-
-2007-01-28      Nick Kledzik    <kledzik@apple.com>
-
-       src/ld.cpp: enable LLVM_SUPPORT by default
-       src/LLVMReader.hpp: don't use absolute paths for llvm headers and libraries
-       
-
-2007-01-26      Rick Balocca    <rbalocca@apple.com>
-       * src/ObjectDump.cpp: The usage() message was incorrect.
-
-
-2007-01-25      Rick Balocca    <rbalocca@apple.com>
-       * unit-tests/test-cases/zero-fill3:  It was reporting FAIL on ld64 error return.
-               It should have been checking for non-error return.
-
-
-2007-01-24      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4952297> x86 fast stubs should not cross 64-byte boundries
-       * src/MachOWriterExecutable.hpp: for x86, 64-byte align __jump_table section 
-       and make 64-btye crossing stubs be empty entries with indirect symbol table 
-       entry of INDIRECT_SYMBOL_ABS
-
-
-2007-01-19      Nick Kledzik    <kledzik@apple.com>
-
-       * src/Options.h: add readOnlyx86Stubs()
-       * src/Options.cpp: support -read_only_stubs
-       * src/MachOWriterExecutable.hpp: make __IMPORT segment not writable if -read_only_stubs is used
-       
-
-2007-01-16  Eric Christopher  <echristo@apple.com>
-
-       <rdar://problem/4856341> ld64 --help isn't recognized
-       * src/Options.cpp (Options::parse): Support --help and -help.
-
-
-2007-01-15      Nick Kledzik    <kledzik@apple.com>
-
-       * src/MachOFileAbstraction.hpp: add range checking on macho_scattered_relocation_info::set_r_address()
-
-
-2007-01-14      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4514409> Support wildcards in contents of -exported_symbols_list
-       * src/Options.h: add SetWithWildcards class
-       * src/Options.cpp: add -exported_symbol and -unexported_symbol and use SetWithWildcards
-       * doc/man/man1/ld.1: add -exported_symbol and wildcard explanation
-       * unit-tests/test-cases/exported-symbols-wildcards: added test case
-
-
-2007-01-10      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4868270> [U]SDT probes should use C calling convention
-       * src/Options.cpp: Add -read_only_dof
-       * src/ld.cpp: create __dof section(s) based on probe and isenabled sites
-       * src/MachOReaderRelocatable.hpp: parse new sdt 2.0 probes encoded in .o files
-       * src/MachOWriterExecutable.hpp: handle regenerating dtrace probes into .o files
-       * unit-tests/test-cases/dtrace-static-probes: added test case
-
-
------ Tagged ld64-69.8
-
-2007-01-30      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4964508> Support LD_FORCE_NO_SEG_ADDR_TABLE
-       * src/Options.cpp: Support LD_FORCE_NO_SEG_ADDR_TABLE
-       
-
------ Tagged ld64-69.7
-
-2007-01-25      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4949507> Leopard9A351: CFM Apps Are Broken because CFM glue is missing
-       * src/MachOReaderRelocatable.hpp: check S_ATTR_NO_DEAD_STRIP in dontDeadStrip()
-
-
------ Tagged ld64-69.6
-
-2007-01-24      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4947347> LD_TRACE_ARCHIVES should only print out when a .o is actually used from an archive
-       * src/ld.cpp: create and use logArchive() 
-
-       
------ Tagged ld64-69.5
-
-2007-01-22      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4946075> 9A350: can't link ppc programs with ld_classic
-       * src/Options.cpp: Remove support for LD_NO_CLASSIC_LINKER. Add support for -classic_linker
-
-       
------ Tagged ld64-69.4
-       
-2007-01-17      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4925645> QTComponents does not link with ld64
-       * src/MachOReaderRelocatable.hpp: handle N_RSYM and N_PSYM stabs
-
-       
------ Tagged ld64-69.3
-
-2007-01-03      Nick Kledzik    <kledzik@apple.com>
-
-       * src/Options.cpp: If the same dylib is specified twice and the second is specified weak, make it weak
-
-
------ Tagged ld64-69.2
-
-2006-12-18      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4889729> -dead_strip without -exported_symbols_list should not strip global functions from archives
-       * src/ld.cpp: when adding a .o file from an archive, add all its global symbols to live roots
-       * unit-tests/test-cases/dead_strip-archive: added
-
-
-2006-12-18      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4889409> flat_namespace main executables do not need to indirect interior references
-       * src/MachOWriterExecutable.hpp: don't indirect references to global symbols in main executables
-       * unit-tests/test-cases/flat-main: updated to test for indirection
-       * unit-tests/test-cases/flat-dylib: added
-
-
------ Tagged ld64-69.1
-
-2006-12-15      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4886721> -flat_namespace does not work with -mdynamic-no-pic
-       * src/MachOWriterExecutable.hpp: rework checking for use of ppc absolute addressing to allow them as long as
-         the target is within the same linkage unit.
-
-
-2006-12-15      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4886652> -ObjC should only load .o with .objc_ symbols
-       * src/Options.cpp: remove warning from -ObjC and have it instead set fLoadAllObjcObjectsFromArchives
-       * src/MachOReaderArchive.hpp: when -ObjC is used, preload all .o files from archives that contain .objc_ symbols
-
-
------ Tagged ld64-69
-
-2006-12-13      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4879913> prebound interior pointers must be non-zero
-       * src/MachOWriterExecutable.hpp: in fixUpReference_powerpc() set lazy pointers bound to with the dylib to
-        their target value. Properly set REFERENCE_FLAG_UNDEFINED_* flags in reference table and n_desc
-
-
-2006-12-09      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4868738> ld64 fails to detect error that ld_classic does
-       * src/MachOWriterExecutable.hpp: check for absolute reloc to an external symbol
-       * src/MachOReaderRelocatable.hpp: ignore -mlong-branch stubs in .o files
-
-
-2006-12-09      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4874209> symbols with REFERENCED_DYNAMICALLY should never be stripped
-       * src/MachOWriterExecutable.hpp: update Writer<A>::shouldExport() to check for kSymbolTableInAndNeverStrip
-       * unit-tests/test-cases/main-stripped: add test that dynamically referenced symbol cannot be stripped
-
-
-2006-12-08      Nick Kledzik    <kledzik@apple.com>
-
-       * unit-tests/test-cases/allowable-client: add variant test cases (e.g. CoreServices_profile)
-       * src/ld.cpp: allow frameworks with variant install names (e.g. CoreServices_profile) to be private clients
-
-
-2006-12-08      Nick Kledzik    <kledzik@apple.com>
-
-       * doc/man/man1/ld.1: rewrite man page
-       * src/Options.h: add warnObsolete()
-       * src/Options.cpp: use warnObsolete() on many options.  Make nonWeak the weak-mis-match default.
-               Make -ObjC mean -all_load.
-
------ Tagged ld64-68.3
-
-2006-12-05      Nick Kledzik    <kledzik@apple.com>
-
-       * src/ld.cpp: allow umbrella frameworks to have variant install names (e.g. CoreServices_profile) and still link
-
-
------ Tagged ld64-68.2
-
-2006-12-05      Nick Kledzik    <kledzik@apple.com>
-
-       * src/MachOWriterExecutable.cpp: Use N_PBUD in the symbol table for undefined symbols in prebound dylibs
-
-
------ Tagged ld64-68.1
-
-2006-12-01      Nick Kledzik    <kledzik@apple.com>
-
-       * src/Options.cpp: always generate module tables for 32-bit architectures so that ld_classic
-               can link against them
-
-
------ Tagged ld64-68
-
-2006-12-01      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4858299> seg_addr_table needs matching fuzziness
-       * src/Options.cpp: special case a how a dozen dylib are looked up in the seg_addr_table
-
-
-2006-12-01      Nick Kledzik    <kledzik@apple.com>
-
-       * src/Options.cpp: have all -static links for 32-bit archs roll over to ld_classic unless
-               LD_NO_CLASSIC_LINKER_STATIC is set.
-       * unit-tests/bin/make-recursive.pl: set LD_NO_CLASSIC_LINKER_STATIC for unit tests
-
-
-2006-11-29      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4855542> ld64-67: QTComponents fails to build
-       * src/MachOReaderRelocatable.hpp: don't error out when a local non-lazy pointer does not point to a symbol
-       * unit-tests/test-cases/strip_local: added test case
-
-
-2006-11-28      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4433496> Need a way to mark libraries usable by dynamic linker but unusable by static linker
-       * src/Options.cpp: allow -client_name to be used with main executables
-       * src/ld.cpp: generalize -allowable_client.  Any dylib can now restrict who can link against it.  As a convention
-               linking with -allowable_client '!' will mean no one can statically link with the dylib.  It can still be loaded
-               dynamically, or by any existing clients, but no new clients can link with it.
-       * unit-tests/test-cases/allowable-client/Makefile: enable previously commented out test cases.  Add test cases
-               of a dylib that allows no clients and just one client
-
-2006-11-27      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4795615> -final_output should be used if -install_name not used
-       * src/Options.cpp: fall back to using -final_output for install name
-
-
------ Tagged ld64-67
-
-2006-11-17      Nick Kledzik    <kledzik@apple.com>
-
-       * src/MachOWriterExecutable.hpp: support __IMPORT segment being slide independently of __DATA segment in shared cache
-
-
-2006-11-16      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4838262> 9a303: ld -filelist Bus Error
-       * src/Options.cpp: add check that -filelist is followed by an argument
-
-
-2006-11-16      Nick Kledzik    <kledzik@apple.com>
-
-       * src/MachOWriterExecutable.hpp: when building split-seg dylibs, LINKEDIT goes in read-only side
-
-
-2006-11-15      Nick Kledzik    <kledzik@apple.com>
-
-       * src/MachOWriterExecutable.hpp: set proper attributes for __eh_frame in ld -r mode
-       * unit-tests/test-cases/eh_frame: added test case
-
-
-2006-11-10      Nick Kledzik    <kledzik@apple.com>
-
-       * src/MachOReaderRelocatable.hpp: redirect references to static weak stubs to the real target
-
-
-2006-11-09      Nick Kledzik    <kledzik@apple.com>
-
-       * src/MachOWriterExecutable.hpp: r_address is offset from first LC_SEGMENT vmaddr - not from segment with lowest address
-
-
------ Tagged ld64-66.1
-
-2006-11-09      Nick Kledzik    <kledzik@apple.com>
-
-       * src/MachOWriterExecutable.hpp: initialize fModuleInfoAtom to zero
-
-
-2006-11-08      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4821985> FSF GCC's libjava doesn't link with Ochre ld64
-       * src/MachOReaderRelocatable.hpp: ignore debug_line section if debug_info section is missing or empty
-
------ Tagged ld64-66
-
-2006-11-07      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4824368> SWB: d64-65 does not built usage split-seg dylibs
-       * src/MachOWriterExecutable.hpp: when prebinding split-seg correctly set r_address fields and on
-       disk values for external relocations
-       * unit-tests/test-cases/prebound-split-seg: added test case
-
-
-2006-11-03      Nick Kledzik    <kledzik@apple.com>
-
-       * src/MachOReaderDylib.hpp: don't report dependent libraries if MH_NO_REEXPORTED_DYLIBS bit is set
-       * src/MachOWriterExecutable.hpp: set MH_NO_REEXPORTED_DYLIBS bit if dylib does not logically re-export any other dylibs
-       * unit-tests/test-cases/re-export-flag: added test case
-       * src/machochecker.cpp: validate use of MH_NO_REEXPORTED_DYLIBS
-
-
-2006-11-02      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4814565> Mysterious messages from ld64 with MACOSX_DEPLOYMENT_TARGET = 10.5
-       * src/MachOWriterExecutable.hpp: kPointerWeakImport is a valid reference type to cross segments
-
-
-2006-11-02      Nick Kledzik    <kledzik@apple.com>
-
-       * src/Options.cpp,h: Add support for -rpath
-       * src/MachOFileAbstraction.hpp: add macho_rpath_command
-       * src/MachOWriterExecutable.hpp: add RPathLoadCommandsAtom to create LC_RPATH for each -rpath
-
-
------ Tagged ld64-65
-
-2006-10-30      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4729162> x86_64 default stack_addr is wrong
-       * src/Options.cpp: change default 64-bit stack location when using -stack_size
-
-
-2006-10-30      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4474316> dylibs need modules for 10.3 and for ld_classic in Salt
-       * src/MachOWriterExecutable.hpp: add ModuleInfoLinkEditAtom to create module table stuff
-       * src/Options.cpp,h: Add needsModuleTable()
-       * src/MachOFileAbstraction.hpp: Add macho_dylib_module, macho_dylib_reference, and macho_dylib_table_of_contents
-
-
-2006-10-27      Nick Kledzik    <kledzik@apple.com>
-
-       * unit-tests/test-cases/no-uuid/Makefile: add -gstabs+ to be compatible with latest compiler
-       * unit-tests/test-cases/stabs-coalesce/Makefile: add -gstabs+ to be compatible with latest compiler
-
-
-2006-10-26      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4585230> i386 -mdynamic-no-pic switch statement jump table is out of line
-       * src/MachOWriterExecutable.hpp: for i386 don't check for direct references to weak symbols
-
-
-2006-10-26  Devang Patel  <dpatel@apple.com>
-
-       * src/LLVMReader.hpp: Supply final output file path to optimizer.
-
-2006-10-26  Devang Patel  <dpatel@apple.com>
-
-       * src/ObjectFile.h: Make setSection* methods virtual.
-       * src/LLVMReader.hpp: Override setSection* methods.
-
-2006-10-26  Devang Patel  <dpatel@apple.com>
-
-       * unit-tests/test-case/llvm-integration/a13.h: New.
-       * unit-tests/test-case/llvm-integration/a13.cc: New.
-       * unit-tests/test-case/llvm-integration/main13.cc: New.
-
-2006-10-26  Devang Patel  <dpatel@apple.com>
-
-       * src/options.h, src/options.cpp: Add -save-temps command line option.
-       * src/LLVMReader.hpp: Use saveTemps option.
-
-
-2006-10-26  Devang Patel  <dpatel@apple.com>
-
-       * src/LLVMReader.hpp: Remove invalid module from memory.
-
-2006-10-26  Devang Patel  <dpatel@apple.com>
-
-       * src/LLVMReader.hpp: Collect symbol alignment info from LLVM optimizer.
-
-2006-10-21  Eric Christopher  <echristo@apple.com>
-
-       * src/ld.cpp (Linker::Linker): Check for LD_NO_CLASSIC_LINKER before
-       invoking ld_classic.
-       * unit-tests/test-cases/relocs-literals/Makefile: Run for -mdynamic-no-pic
-       and pic.
-       * unit-tests/test-cases/static-executable/Makefile: Skip for 64-bit. Add
-       -dead_strip to command line.
-
------ Tagged ld64-64.2
-
-2006-10-19      Nick Kledzik    <kledzik@apple.com>
-
-       * ld64.xcodeproj/project.pbxproj: stop copying LLVMReader.hpp into man1 directory
-
------ Tagged ld64-64.1
-
-2006-10-19      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4791643> ld64-63.1 erroneously coalesces an empty string with a non-empty string
-       * src/MachOReaderRelocatable.hpp: rework cstring parsing to not assume all strings are start
-         at section alignment boundaries, and when coalescing empty strings always use one with greatest
-         alignment requirement
-       * src/MachOWriterExecutable.hpp: in -r mode, don't pad end of cstring section
-       * src/ObjectFile.h: correctly name leadingZeros() as trailingZeros()
-       * src/ld.cpp: leadingZeros() --> trailingZeros()
-
-
-2006-10-18  Eric Christopher  <echristo@apple.com>
-
-       * unit-tests/test-cases/read-only-relocs/Makefile: Skip for x86_64.
-       * unit-tests/test-cases/llvm-integration/Makefile: Skip if llvm isn't
-       present.
-
-2006-10-18      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4783853> ld64 change required to go with assembler cstring change
-       <rdar://problem/4732996> ld64 should error when a local relocation references an address outside its section
-       * src/MachOReaderRelocatable.hpp: for x86_64  in order to work with local or external relocations to cstrings
-       change parser to allow atoms with a pending name that is resolved after references are instantiated.
-       Make direct references to kRegularDefinition atoms.
-       * src/MachOWriterExecutable.hpp: in -r mode for x86_64 generate L* labels for cstrings and use external relocations
-       * unit-tests/test-cases/relocs-literals/test.c: add two cases of cstring literal plus addend
-
-
-2006-10-06      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4786250> check MACOSX_DEPLOYMENT_TARGET if -macosx_version_min is not used
-       * src/Options.cpp: if -macosx_version_min is not used, check MACOSX_DEPLOYMENT_TARGET, if
-       that is unused, default to 10.5
-
------ Tagged ld64-64
-
-2006-10-06      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4756806> crash in ppc64 program - bl to saveFP, but saveFP is too far away?
-       * src/MachOWriterExecutable.hpp: in addPPCBranchIslands(), properly account for growth of __text
-
-
-2006-10-06      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4769120> Linker-defined alias converts reference into definition and generates error.
-       * src/MachOReaderRelocatable.hpp: only alias symbols actually in the symbol table
-
-
-2006-10-06      Nick Kledzik    <kledzik@apple.com>
-
-       * unit-tests/test-cases/dwarf-debug-notes/Makefile: crt1.o no longer has stabs, so don't need to strip it
-       * unit-tests/test-cases/dwarf-debug-notes-r/Makefile: crt1.o no longer has stabs, so don't need to strip it
-
-
-2006-10-06      Nick Kledzik    <kledzik@apple.com>
-
-       * src/MachOReaderRelocatable.hpp: rework dwarf line parsing to fix warnings that starting
-       showing up with gcc-5421
-
-
-2006-10-05  Eric Christopher  <echristo@apple.com>
-
-       <rdar://problem/4760935> ld64 needs to support libtool options
-       * src/Options.cpp (Options::parse): Add -noall_load, -install_name,
-       -current_version and -compatibility_version.
-
-2006-10-03  Eric Christopher  <echristo@apple.com>
-
-       * src/Options.cpp (Options::gotoClassicLinker): Use execvp
-       to call ld_classic.
-
-2006-10-03  Eric Christopher  <echristo@apple.com>
-
-       * unit-tests/test-cases/tentative-to-real/Makefile: Clean up after tests.
-
-2006-10-03  Eric Christopher  <echristo@apple.com>
-
-       * unit-tests/include/common.makefile (VALID_ARCHS): Add x86_64.
-       (OTOOL): Remove munging based on ARCH.
-
-2006-09-29      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4743925> problem merging .o files built with and without -fno-common
-       src/Options.*: make MakeTentativeDefinitionsReal a reader option
-       src/ObjectFile.h: make MakeTentativeDefinitionsReal a reader option
-       src/MachOWriterExecutable.hpp: make MakeTentativeDefinitionsReal a reader option
-       src/MachOReaderRelocatable.hpp: only assign a section name of __common to
-               tentative defintions when making a final linked image
-
-
-2006-09-28      Nick Kledzik    <kledzik@apple.com>
-
-       src/Options.h/.cpp: add support for -segaddr option
-       src/MachOWriterExecutable.hpp: In Writer::assignFileOffsets(), use -segaddr info
-
-
-2006-09-28      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4587349> Emit new CPU subtypes for ppc64 and x86-64 when targeting 10.5 or later
-       src/MachOWriterExecutable.hpp: set high bit of cpusubtype of 64-bit main executables when targeting 10.5 or later
-
-
-2006-09-28     Devang Patel    <dpatel@apple.com>
-
-       Add LLVM LTO support
-       src/LLVMReader.hpp: New file.
-       src/ld.cpp: Add optimization phase. Use LLVM LTO.
-       unit-tests/test-cases/llvm-integration: New tests.
-
-2006-09-27      Nick Kledzik    <kledzik@apple.com>
-
-       ld64.xcodeproj/project.pbxproj: remove accidental install of source file into man1
-
-
-2006-09-25      Nick Kledzik    <kledzik@apple.com>
-
-       src/Architectures.hpp: add kPointerDiff16 for ppc and ppc64
-       src/MachOReaderRelocatable.hpp: support kPointerDiff16
-       src/MachOWriterExecutable.hpp: support kPointerDiff16
-
------ Tagged ld64-63.1
-
-2006-09-22      Nick Kledzik    <kledzik@apple.com>
-
-       src/MachOWriterExecutable.hpp: include stubs in LC_SEGMENT_SPLIT_INFO
-
-
-2006-09-21      Nick Kledzik    <kledzik@apple.com>
-
-       src/Options.cpp: disable split-seg dylibs for 64-bit architectures
-
-
-2006-09-19      Nick Kledzik    <kledzik@apple.com>
-
-       src/MachOReaderRelocatable.hpp: rework __cstring parsing to better handle mixed alignment cstrings
-       src/MachOWriterExecutable.hpp: in -r mode, make all __cstrings aligned to section alignment
-
-
-2006-09-19      Nick Kledzik    <kledzik@apple.com>
-
-       src/MachOWriterExecutable.hpp: rework encoding of LC_SEGMENT_SPLIT_INFO
-
-
-2006-09-19      Nick Kledzik    <kledzik@apple.com>
-
-       src/Options.cpp: check for -search_paths_first in first pass
-
-
------ Tagged ld64-63
-
-2006-09-15      Nick Kledzik    <kledzik@apple.com>
-
-       src/Options.cpp: since the ld64 will repeatedly search an archive, and some project list archives
-               multiple times on command line to work with traditional linkers, automatically ignore duplicate libraries
-       unit-tests/test-cases/archive-duplicate: added test case
-
-
-2006-09-15      Nick Kledzik    <kledzik@apple.com>
-
-       src/Options.cpp: support -r -static
-       src/MachOWriterExecutable.hpp: support -r -static an don't generate LC_DYSYMTAB
-
-
-2006-09-14      Nick Kledzik    <kledzik@apple.com>
-
-       src/MachOWriterExecutable.hpp: in -r mode references to weak symbols should not create external relocations
-               as that can cause nmedit to errror later.
-
-
-2006-09-13      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4718189> ld64: Handle .objc_class_name exports specially
-       src/Options.cpp: add hack so that .objc_class_name_XXX in -exported_symbols_list imples _OBJC_CLASS_$_XXX
-       src/ld.cpp: add hack to supporess errors about .objc_class_name_XXX or _OBJC_CLASS_$_XXX being undefined
-
-
-2006-09-12      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4474172> Support -prebind when targeting ppc and OS < 10.4
-       src/Options.h: add splitSeg() and baseWritableAddress()
-       src/Options.cpp: Add support for -seg_addr_table and LD_SEG_ADDR_TABLE, and -prebind and LD_PREBIND.
-       src/src/MachOWriterExecutable.hpp: support split-seg and canonical prebound files to be generated
-
-
-2006-09-11      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4464904> Linking a dylib or binary from identical binaries should produce the same output
-       src/MachOWriterExecutable.hpp: set the timestamps to be constant
-
-
-2006-09-11      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4070025> Linker support for ordering all sections and symbols
-       src/Options.cpp: Add -order_file_statistics.  Allow architecture prefixes in order files
-       src/ld.cpp: Use fOptions.printOrderFileStatistics()
-
-
-2006-09-11      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/3894079> Support -sectorder
-       unit-tests/test-cases/order_file: added test case
-       src/ld.cpp: Implement order file support in Linker::sortAtoms()
-       src/Options.h: add Options.orderedSymbols()
-       src/Options.cpp: add parseOrderFile(), implement -order_file
-
-
-2006-09-07      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4637023> need -i for 64-bit (or equivalent)
-       <rdar://problem/4014529> Support -i for aliasing exported symbols
-       unit-tests/test-cases/alias-objects: added
-       unit-tests/test-cases/alias-command-line: added
-       src/ObjectFile.h: Added Atom::getOrdinal() as new way to sort atoms. Added ReaderOptions.fAliases
-       src/MachOReaderRelocatable.hpp: Added SymbolAliasAtom to handle multiple symbols to same address
-       src/MachOReaderArchive.hpp: implement Atom::getOrdinal() to space out atom ordinals across member objects
-       src/Options.cpp: support -i, -alias, -alias_list.  Move search of /Network/Library/Frameworks to after /System/Library/Frameworks
-       src/MachOWriterExecutable.hpp: pad out seg_info data.  Implement getOrdinal().
-       src/ObjectDump.cpp: call constructors directly instead of using make() wrapper
-
-
-2006-09-01      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4458878> Need the ability to tag libraries/plug-ins with security attributes
-       src/MachOReaderDylib.hpp: add warning if using -root_safe or -setuid_safe and link against dylib that is not
-       src/ObjectFile.h: add ReaderOption fRootSafe and fSetuidSafe
-       src/Options.cpp: handle -root_safe or -setuid_safe command line options
-       src/MachOWriterExecutable.hpp: set MH_ROOT_SAFE and MH_SETUID_SAFE flags
-
-
-2006-08-31      Nick Kledzik    <kledzik@apple.com>
-
-       src/ld.cpp: Add Linker::processDTrace() for processing dtrace static probes
-       src/OpaqueSection.hpp: renamed, add symbol name, add ability to add references
-       ld64.xcodeproj/project.pbxproj: remove SectCreate.cpp, add OpaqueSection.hpp
-
-
-2006-08-28      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4571042> Add convention for removing symbols at link time
-       <rdar://problem/3962731> Assembler -L option causes ld64 to split stubs
-       unit-tests/test-cases/special-labels: added test case
-       src/MachOReaderRelocatable.hpp: ignore L* labels, make l* labels as kSymbolTableNotIn
-
-
-2006-08-28      Nick Kledzik    <kledzik@apple.com>
-
-       src/lObjectFile.h: refactor isTargetUnbound() into getTargetBinding()
-       src/ld.cpp: create __dof section in final linked images from dtrace static probes
-       src/Architectures.hpp: add kDtraceProbe
-       src/Options.h/cpp: Add support for -dtrace
-       src/machochecker.cpp: support LC_SEGMENT_SPLIT_INFO
-       src/MachOWriterExecutable.hpp: support kDtraceProbe
-       src/MachOReaderRelocatable.hpp: suppport kDtraceProbe
-
-
-2006-08-25      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4701529> generate LC_SEGMENT_SPLIT_INFO for 10.5 or later dylibs
-       src/Options.h&.cpp: implement sharedRegionEligible() to control when LC_SEGMENT_SPLIT_INFO is added
-       src/MachOFileAbstraction.hpp: add macho_linkedit_data_command
-       src/MachOWriterExecutable.hpp: generate LC_SEGMENT_SPLIT_INFO load command and linkedit content
-
------ Tagged ld64-62
-
-2006-08-15      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4681062> wrong error message when symbol is found in unused indirect library
-       src/ld.cpp: remove indirect libraries if they are not re-exported
-       unit-tests/test-cases/indirect-dylib: added test case
-
-
-2006-08-15      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/3930461> alignment needs to be richer
-       src/ObjectFile.h: define ObjectFile::Alignment class for tracking rich alignment info
-       src/ld.cpp: modify SymbolTable::add() to work with new Alignment type
-       src/MachOReaderRelocatable.hpp: use new Alignment type. Remove alignAtLeast() and handleAnonymousNonLazyPointers()
-       src/MachOWriterExecutable.hpp: update for new Alignment type, use modulus when calculating layout address
-       src/ObjectDump.cpp: print richer Alignment info
-       unit-tests/test-cases/align-modulus: added test case
-
-
-2006-08-11      Nick Kledzik    <kledzik@apple.com>
-
-       remove OPEN_SOURCE conditionals around x86_64 support
-
-
-2006-07-31      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4654131> ld64 while linking cc1 [ when dead_strip is ON]
-       src/ld.cpp: Add ivar fAtomsWithUnresolvedReferences to track atoms not initially resolvable
-       unit-tests/test-cases/dead_strip-archive: added test case
-
-
-2006-07-31      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4656617> x86_64: instructions with immediate and rip-relative operands need to use new relocation types
-       src/MachOWriterExecutable.hpp: generate new reloc types in -r mode
-       src/MachOReaderRelocatable.hpp: parse new reloc types
-       unit-tests/test-cases/relocs-asm/relocs-asm.s: add test cases for new reloc type
-
-
-2006-07-18      Nick Kledzik    <kledzik@apple.com>
-
-       src/MachOReaderRelocatable.hpp: suppress warning about dwarf info parsing for one benign no-op case
-       the compiler emits when there are not functions in the __text section
-
-
-2006-07-17      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4634840> faster debug note generation
-       src/ld.cpp: rework collectDebugInfo() to produce all debug notes in one pass, intead of a
-       pass per .o file. Added timing info for collectDebugInfo() to -print_statistics
-       unit-tests/test-cases/dwarf-debug-notes-r/Makefile: add expliced -arch to ld -r
-       unit-tests/test-cases/dwarf-debug-notes-r/expected-stabs: alter for new debug notes order
-
-
-2006-07-17      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4623994> ld64 VSIZE is 1.18GB when building Finder ppc64
-       src/ld.cpp: fixed typo in createReader() that prevented dylibs from being unmapped
-
------ Tagged ld64-61.1
-
-2006-07-11      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4622049> ld64-61: gcc DejaGnu tests failing due to -arch followed by unknown architecture name
-       src/Options.cpp: map ppc750, ppc7400, ppc7450, and ppc970 to ppc. Improve error message
-
-2006-07-11      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4622769> If -arch is missing, rollover to ld_classic does not happen
-       src/Options.h: make gotoClassicLinker() public
-       src/ld.cpp: call gotoClassicLinker() if the inferred architecture is ppc or i386
-
------ Tagged ld64-61
-
-2006-06-29      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4606628> ld64 should be renamed to ld
-       src/Options.cpp: exec() ld_classic if -arch ppc or -arch i386 is seen
-       src/ld.cpp: alter version string
-       ld64.xcodeproj/project.pbxproj: change install location to /usr/bin/ld, add symlink from /usr/bin/ld64
-       doc/man/man1/ld.1: added
-
------ Tagged ld64-60
-
-2006-06-28      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4604539> Can't link large ppc64 program: ld64 says "bl out of range"
-       MachOWriterExecutable.hpp: fix branch island generation to work for weak_import functions
-       and properly chain together branch islands
-       MachOReaderRelocatable.hpp: improve performance of huge .o file reading by sorted references
-       only when done
-
-2006-06-28      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4603454> MySQL-36 fails to build with ld64-59
-       src/MachOReaderRelocatable.hpp: back out fix for 4585335
-       src/MachOWriterExecutable.hpp: back out fix for 4585335
-
-2006-06-27      Nick Kledzik    <kledzik@apple.com>
-
-       src/MachOReaderRelocatable.hpp: handle N_GSYM without ending :G() since that is how
-       dwarf debug notes are formed.
-
-2006-06-23      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4599239 objc class with no superclass causes bad undefined symbol
-       src/MachOReaderRelocatable.hpp: handle NULL superclass in objc_class
-       unit-tests/test-cases/relocs-objc/test.m: add case with no super class
-
-
-2006-06-23      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4313369> ld64 doesn't support variant linking -framework fw,_debug
-       src/Options.cpp: enhance findFramework() to support suffixes
-
------ Tagged ld64-59
-
-2006-06-22      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4596726> ld64 lost DWARF debug notes
-       src/MachOReaderRelocatable.hpp: add fHasUUID so kDebugInfoStabsUUID can be set later
-       unit-tests/test-cases/dwarf-debug-notes-r: added test case
-
-2006-06-21      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4567995> python 64-bit address miscalculation
-       src/MachOReaderRelocatable.hpp: change getTargetOffset() to sign extend the 32-bit value to 64-bits
-
-2006-06-21      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4535036> ld64 seems to offset things incorrectly when using -r
-       src/MachOWriterExecutable.hpp: in -r mode, virtual sections should not increment address
-
-
------ Tagged ld64-58
-
-2006-06-16      Nick Kledzik    <kledzik@apple.com>
-
-       src/rebase.cpp: fix page alignment problem
-       src/rebase.cpp: fix endianess problem with local non-lazy pointers
-
-2006-06-15      Nick Kledzik    <kledzik@apple.com>
-
-       src/rebase.cpp: fix to build in CurryWeed
-       ld64.xcodeproj/project.pbxproj: fix to build properly in CurryWeed
-
-2006-06-15      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4495309> Support .objc_class_name_* symbols
-       src/ObjectFile.h: Add kSymbolTableInAsAbsolute
-       src/MachOReaderRelocatable.hpp: synthesize references to required objc classes
-       src/MachOWriterExecutable.hpp: write objc_class_name as absolute symbol
-       unit-tests/test-cases/objc-references: added
-
-2006-06-15      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4484369> SECTION_ATTRIBUTES unset in ppc64 mach-o header
-       src/MachOWriterExecutable.hpp: add section attribute for sections with code
-
-2006-06-15      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4569407> ld64 bogus duplicate symbol name linking GNU libobjc
-       src/MachOReaderRelocatable.hpp: only special case Apple objc runtime objc classes
-
-2006-06-15      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4582999> x86_64: ".align" directive not honored
-       src/MachOReaderRelocatable.hpp: change code alignment to not depend on atom size
-
-2006-06-14      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4585335> jump table into middle of weak symbol causes error
-       src/MachOReaderRelocatable.hpp: create direct references to the interior of weak symbols
-       src/MachOWriterExecutable.hpp: do not error on absolute references to interior of weak symbols
-
-2006-06-13      Nick Kledzik    <kledzik@apple.com>
-
-       src/Options.cpp: allow -image_base as an alias for -seg1addr
-
-2006-06-13      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4585115> implement -d
-       src/Options.h: add fMakeTentativeDefinitionsReal
-       src/Options.cpp: set fMakeTentativeDefinitionsReal if -d option is found
-       src/MachOWriterExecutable.hpp: turn tentative into real definition if makeTentativeDefinitionsReal
-       unit-tests/test-cases/btentative-to-real: added test case
-
-2006-06-13      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4584355> implement -bundle_loader
-       src/Options.h: add fBundleLoader bit to DynamicLibraryOptions
-       src/Options.cpp: handle -bundle_loader
-       src/ld.cpp: pass fBundleLoader bit to MachOReaderDylib
-       src/MachOReaderDylib.hpp: support reading MH_EXECUTE files if fBundleLoader is set
-       src/MachOWriterExecutable.hpp: set bundle loader ordinal as EXECUTABLE_ORDINAL
-       unit-tests/test-cases/bundle_loader: added test case
-
-2006-06-12      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4583347> -syslibroot can cause "can't find ordinal for imported" error
-       src/MachOReaderDylib.hpp: in  Reader::reExports() compare install path in addition to load path
-
-
-2006-06-10      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4548935> Need rebasing tool
-       src/rebase.cpp: added
-       unit-tests/test-cases/rebase-basic: added
-       doc/man/man1/rebase.1: added
-       ld64.xcodeproj/project.pbxproj:  added rebase target.  changed all targets to build with dwarf
-
-
-2006-06-10      Nick Kledzik    <kledzik@apple.com>
-
-       src/machochecker.cpp: add some ppc reloc sanity checking
-
------ Tagged ld64-57
-
-2006-06-06      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4565088> ld64 is not adding a final '/' char on the initial directory-name SO stab debug map entry
-       ld.cpp: Change Linker::synthesizeStabs() to assure directory SO always has a trailing slash
-       unit-tests/test-cases/dwarf-debug-notes/expected-stabs: update with trailing /
-
-2006-06-06      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4572702> -sectcreate of a 0-byte section fails
-       MachOWriterExecutable.cpp: Don't error out on zero length segments
-       MachOWriterExecutable.cpp: For ppc64 reloc base address is the first writable segment iff
-        there is a writable segment >4GB from base address
-
-2006-06-04  Eric Christopher  <echristo@apple.com>
-
-       Radar 4560240
-       Radar 3964999
-       * src/ld.cpp (createReader): Fixed error message.
-       (resolve): Ditto.
-       (resolveFrom): Ditto.
-       (checkUndefines): Ditto.
-
------ Tagged ld64-56
-
-2006-05-23      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4558079> No debug notes for ObjC methods when linking with ld64
-       ld.cpp: don't limit debug notes to functions starting with underscore
-
-2006-05-22      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4556982> ld64 spends much time in mach_o::relocatable::Reader<x86_64>::findAtomByName
-       * src/MachOReaderRelocatable.hpp: add makeReferenceToSymbol() so that x86_64 does not need to do by-name lookups
-
-2006-05-22      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4535044> remove inferring warning
-       * ld.cpp: Remove "inferring" warning.  If a link failed and now arch was specifed add which arch was
-       inferred to error message
-
-2006-05-19      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4544001> ld64 does not honor -arch_multiple
-       * ld.cpp: If fOptions.printArchPrefix(), add architecture name to error message
-
-2006-05-19      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4555973> Support S_16BYTE_LITERALS section types
-       * src/MachOReaderRelocatable.hpp: support S_16BYTE_LITERALS
-       * src/MachOWriterExecutable.hpp: support S_16BYTE_LITERALS
-
-2006-05-19      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4548803> "warning can't parse dwarf compilation unit info" warnings building debug
-       * src/MachOReaderRelocatable.hpp: fix bugs in dwarf line table parsing
-
------ Tagged ld64-55
-
-2006-05-18      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4534339> Default the pagezero size to 4GB for x86-64
-       * src/Options.cpp: Chnage default the pagezero size to 4GB for x86-64
-
-2006-05-18      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4552825> x86_64 CarbonCore fails to link with "atom not found in symbolIndex"
-       * src/MachOWriterExecutable.hpp: in buildObjectFileFixups() don't call addObjectRelocs() on kNoFixUp references
-
-2006-05-18      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4553555> ld64: .section defaults to read-only
-       * src/MachOReaderRelocatable.hpp: default unknown segments to r/w
-
-2006-05-18      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4551990> -fvisibility=hidden causes crashes for x86_64
-       * src/MachOWriterExecutable.hpp: properly handle RIP relative tentative definitions
-
-2006-05-12      Nick Kledzik    <kledzik@apple.com>
-
-       * src/Architectures.hpp: add x86::kAbsolute32
-       * src/MachOReaderRelocatable.hpp: generate x86::kAbsolute32 for mdynamic-no-pic instructions
-       * src/MachOWriterExecutable.hpp: process x86::kAbsolute32 reference kind
-
------ Tagged ld64-54
-
-2006-05-11      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4545108> CF-393 failes to link for x86_64
-       * src/MachOWriterExecutable.cpp: fix sign extension for Rel32 relocs in Writer<x86_64>::fixUpReferenceRelocatable
-
-2006-05-11      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4501434> warning arch x86_64 not found using i386
-       * src/ld.cpp: remove hack to allow x86_64 to link against i386 dylibs
-
-
-2006-05-10      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4543754> x86_64: .objc_class_name symbol names scrambled
-       * src/MachOReaderRelocatable.hpp: properly compute alignment of __OBJC __class sections
-
-
-2006-05-08      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/3894083> Support -dead_strip
-       * src/Options.h/cpp: implement -why_load and -why_live.  Enable -dead_strip.
-       * src/MachOReaderArchive.hpp: implement -why_load
-       * src/MachOReaderRelocatable.hpp: suppress GCC_except_table* symbols in final output
-       * src/ld.cpp: implement dead code stripping
-       * unit-tests/test-cases/dead_strip: added
-
------ Tagged ld64-53
-
-2006-05-05      Nick Kledzik    <kledzik@apple.com>
-
-       * src/Options.cpp: make 10.4 be minimum OS version for newer architectures
-
-2006-05-05      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4147604> N_SO symbols in 64-bit builds have a zero address for n.n_value
-       * src/ld.cpp: for SO stabs, associate first and last atom in the SO range
-       * src/MachOWriterExecutable.hpp: use atom associated with SO stab to set ins n_value
-
-2006-05-05      Nick Kledzik    <kledzik@apple.com>
-
-       * MachOWriterExecutable.hpp: fix end FUN stab to have length of function
-
-
-2006-05-02      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4496250> 64-bit main executables should have 4GB zero page by default
-       * src/Opptions.cpp: change default pagezero_size to 4GB for ppc64
-       <rdar://problem/4492850> 64 bit: apps with -mdynamic-no-pic seg fault when page zero > 4GB
-       * src/MachOWriterExecutable.cpp: rework pagezero for ppc64 so that if any mdynamic-no-pic code
-       is found, the code is kept in the low 2GB, and a new segment is create to map away up to 4GB.
-
-2006-05-02      Nick Kledzik    <kledzik@apple.com>
-
-       * src/Opptions.cpp: remove warning about -stack_addr not specified.  Add warning if 32-bit stack
-       overlaps shared region
-
------ Tagged ld64-52.1
-
-2006-05-01      Nick Kledzik    <kledzik@apple.com>
-
-       * src/MachOReaderRelocatable.cpp: rework handleAnonymousNonLazyPointers() to handle anl's in the middle
-       the __data section too.
-
------ Tagged ld64-52
-
-2006-04-28      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4513304> 64-bit: 9A152 TextEdit crashes in dlopen on bring-up
-       * src/MachOReaderRelocatable.cpp: rework anonymous non-lazy-pointer detection
-
-2006-04-28      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4528054> 64 Bit: Development build of ppc64 TextEdit gets confused about static variables
-       * src/MachOReaderRelocatable.cpp: mark non-lazy-pointer atoms as scopeTranslationUnit if targetting a static symbol
-
-
-
-2006-04-21      Nick Kledzik    <kledzik@apple.com>
-
-       * src/Options.cpp: fix default address for ppc64 custom stack
-       * src/MachOWriterExecutable.cpp: fix set up of ppc64 custom stack
-
-
-2006-04-14      Nick Kledzik    <kledzik@apple.com>
-
-       * src/Options.cpp: fix -sub_library processing to work it dylib is specifed with leaf name
-
------ Tagged ld64-51.1
-
-2006-04-13      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4513304> 64-bit: 9A152 TextEdit crashes in dlopen on bring-up
-       * src/MachOReaderRelocatable.hpp: when detecting anonymous non-lazy-pointers disqualify data
-       that points to static or global symbols
-       * src/ld.cpp: print version of ld64 in error messages
-
-
------ Tagged ld64-51
-
-2006-04-11      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4499168> exported symbols not properly stripped
-       * src/MachOReaderRelocatable.hpp: enable AnonymousAtom::setScope()
-
-2006-03-31      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4498391> ld64 fails when linking debug ppc64 HIToolbox
-       * src/MachOReaderRelocatable.hpp: handle anonymous non-lazy pointers encoded with local relocations
-       * src/MachOWriterExecutable.hpp: in -r mode, only generated INDIRECT_SYMBOL_LOCAL for non-lazy targets that
-
-
-2006-03-31      Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4496499> ld64 should remove generated file if link errors out
-       * src/MachOWriterExecutable.hpp: catch exceptions in Writer<A>::write(), delete output file, and rethrow
-
-
------ Tagged ld64-50
-
-
-2006-03-29      Nick Kledzik    <kledzik@apple.com>
-
-       * src/MachOReaderRelocatable.hpp: synthesize .objc_class_name symbols
-       * src/MachOFileAbstraction.hpp: use strncpy for sect/seg names to zero fill trailing space
-
-2006-03-28      Nick Kledzik    <kledzik@apple.com>
-
-       * src/MachOReaderRelocatable.hpp: fix spurious warning about dwarf line info
-
------ Tagged ld64-49.1
-
-2006-03-25      Nick Kledzik    <kledzik@apple.com>
-
-       * MachOWriterExecutable.hpp : don't complain about ppc64 dyld being based > 4GB
-
------ Tagged ld64-49
-
-2006-03-24     Nick Kledzik    <kledzik@apple.com>
-
-       * src/MachOWriterExecutable.hpp: dyld is allowed to have synthesized non-lazy pointers
-       <rdar://problem/4488113> ld64 is after processing bad GSYM stabs
-       * src/MachOReaderRelocatable.hpp: if a GSYM is found that does not match any data symbol, suppress it
-
-2006-03-23     Nick Kledzik    <kledzik@apple.com>
-
-       * src/MachOWriterExecutable.hpp: in Writer<x86>::fixUpReferenceFinal() fix when x86::kPointer is for an
-       external relocation
-
-2006-03-23     Nick Kledzik    <kledzik@apple.com>
-
-       * src/Options.cpp: change macosx-min-version to default to a per-architecture setting
-         add warning if -pagezero_size is not page aligned
-       * src/MachOWriterExecutable.hpp: properly handle external relocations for ppc64 with 4GB pagezero
-       * src/machochecker.cpp: sanity check relocation records
-
------ Tagged ld64-48
-
-2006-03-21     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4481406> 64bit: passing function pointer to another function passes the wrong function address
-       * src/MachOReaderRelocatable.hpp: when processing a non-lazy pointer to a static function, don't accidentally
-       match it to a STAB symbol.
-
-2006-03-21     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4180168> .eh symbols make up 13% of libstdc++'s stripped binary size
-       * src/ObjectFile.h: add ReaderOptions.fForFinalLinkedImage
-       * src/Options.cpp: setup ReaderOptions.fForFinalLinkedImage
-       * src/MachOReaderRelocatable.hpp: mark .eh symbols kSymbolTableNotIn when building final linked image
-
-2006-03-21     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4473742> ld64 does not parse optional second argument to -filelist
-       * unit-tests/test-cases/filelist: added
-       * src/Options.cpp: in Options::loadFileList() handle comma option
-
-
------ Tagged ld64-47.1
-
-
------ Tagged ld64-47
-
-
------ Tagged ld64-46
-
-2006-03-10     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4419505> ld64 should figure out architecture from .o files
-       * unit-tests/test-cases/auto-arch: added
-       * src/ld.cpp: added Linker::inferArchitecture() to scan .o files are infer architecture to link
-       * src/MachOReaderArchive.hpp: enhanced validFile() to look deeper into archive and really valdate
-       * src/MachOWriterExecutable.hpp: stop using fOptions.architecture()
-       * src/Options.cpp: stop defaulting to ppc64
-
-
-2006-03-09     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4465004> Need "intentionally left blank" dylib stubs
-       * unit-tests/include/common.makefile: add VALID_ARCHS
-       * unit-tests/run-all-unit-tests: set up VALID_ARCHS
-       * unit-tests/test-cases/blank-stubs: add test case
-       * src/ld.cpp: in addDylib(), detect and ignore blank stubs
-       * src/MachOReaderDylib.hpp: in constructor, handle blank stubs
-
-2006-03-09     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4471424> crash in stub with 2GB pagezero
-       * src/MachOWriterExecutable.hpp: StubAtom<ppc64> can't be no-pic if a large zero-page is used
-
-2006-03-06     Nick Kledzik    <kledzik@apple.com>
-
-       * src/Options.cpp: addSectionAlignment, warn if -sectalign alignment is not a power of two
-
------ Tagged ld64-45
-
-
-2006-03-06     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4466930> LP64/9A122: ld64: hang when trying to link DiscRecording framework
-       * src/Options.cpp: addSectionAlignment, warn on zero.  Use log2() for alignment conversion
-
-
------ Tagged ld64-44
-
-2006-03-04     Nick Kledzik    <kledzik@apple.com>
-
-       * src/MachOReaderRelocatable.hpp: fix again test for detection of anonymous non-lazy-pointer.
-       Error out if .o file contains old __DWARFA style dwarf.
-
-2006-03-02     Nick Kledzik    <kledzik@apple.com>
-
-       * src/ld.cpp: only re-map page aligned sub-parts of a fat file.  A conformat mmap() requires alignment.
-
------ Tagged ld64-43
-
-
-2006-03-02     Nick Kledzik    <kledzik@apple.com>
-
-       * src/MachOReaderRelocatable.hpp: <rdar://problem/4464370> tighten detection of anonymous non-lazy-pointer
-
------ Tagged ld64-42
-
-2006-02-28     Nick Kledzik    <kledzik@apple.com>
-
-       * src/MachOReaderRelocatable.hpp: fix x86 __IMPORT permissions for class Segment
-
-2006-02-28     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4461240> SWB: ld64-37 (can't resolve symbol ___dso_handle)
-       * src/MachOWriterExecutable.hpp: add class DsoHandleAtom
-
-2006-02-28     Nick Kledzik    <kledzik@apple.com>
-
-       * unit-tests/test-cases/literals-coalesce-alignment: added test case
-       * src/ld.cpp: when coalescing strings pick one with greater alignment
-       <rdar://problem/4458660> ld64: CG link failed because lo14 reference to anonymous non-lazy-pointer not aligned
-       * unit-tests/test-cases/relocs-c/test.c: tweak to fail like 4458660
-       * src/MachOReaderRelocatable.hpp: detect anonymous non-lazy-pointer and transform into real non-lazy-pointers
-
------ Tagged ld64-41
-
-2006-02-24     Nick Kledzik    <kledzik@apple.com>
-
-       * src/Options.cpp: Warning about -no_dead_strip_inits_and_terms and -i options.
-                                          Fix -weak-l option.
-
------ Tagged ld64-40
-
-2006-02-24     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4454698> Leopard9A113: ppc64 libstdc++.dylib initializer crashes in pthread_once
-       * unit-tests/test-cases/multiple-entry-points: added
-       * src/MachOReaderRelocatable.hpp: make sure that if there are multiple symbols with the same
-       address, that we properly make zero length atoms for all but last symbol
-
-2006-02-24     Nick Kledzik    <kledzik@apple.com>
-
-       * src/Options.cpp: <rdar://problem/4456093> ld64 doesn't realpath(3) B&I tracing paths
-
-2006-02-24     Nick Kledzik    <kledzik@apple.com>
-
-       * src/Options.cpp: <rdar://problem/4457078> 9A110: ld64 can't deal with section names >16 chars
-
-2006-02-23     Nick Kledzik    <kledzik@apple.com>
-
-       * src/MachOWriterExecutable.hpp:  use vector.reserve() to minimize re-allocations
-       * src/Options.cpp: use vector.reserve() to minimize re-allocations
-       * src/MachOReaderRelocatable.hpp:  use vector.reserve() to minimize re-allocations
-       * src/MachOReaderDylib.hpp:  use vector.reserve() to minimize re-allocations
-       * src/ld.cpp:  use vector.reserve() to minimize re-allocations
-
-2006-02-23     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4455927> ld64 creates corrupt executables (and has malloc errors) with -headerpad option
-       * src/MachOWriterExecutable.hpp: Change LoadCommandsPaddingAtom<A>::setSize() to update fLargestAtomSize
-       * unit-tests/test-cases/header-pad: added
-
-2006-02-23     Nick Kledzik    <kledzik@apple.com>
-
-       <rdar://problem/4455192> ld64 creates invalid static executables
-       * src/MachOWriterExecutable.hpp: Change MachHeaderAtom<A>::copyRawContent() to create correct header
-       for static executables.  Change SymbolTableLoadCommandsAtom to skip LC_DYSYMTAB for static executables
-       * src/machochecker.cpp: Add tests that static executables are well formed
-       * unit-tests/test-cases/static-executable: added
-
-2006-02-22     Nick Kledzik    <kledzik@apple.com>
-
-       * src/Options.cpp: <rdar://problem/4453468> chnage printf on unknown arg to a throw
-
------ Tagged ld64-39
-
-2006-02-20     Nick Kledzik    <kledzik@apple.com>
-
-       * unit-tests/test-cases/read-only-relocs: added new test case
-       * src/MachOWriterExecutable.hpp: <rdar://problem/4448922> detect and error on relocs in read-only sections
-       * src/MachOReaderRelocatable.hpp: fix parsing of i386 absolute addressing relocs
-
-2006-02-20     Nick Kledzik    <kledzik@apple.com>
-
-       * unit-tests/test-cases/stabs-coalesce: added new test case
-       * src/ld.cpp.hpp: <rdar://problem/4449226> in collectStabs removed unused stabs
-
------ Tagged ld64-38
-
-2006-02-17     Nick Kledzik    <kledzik@apple.com>
-
-       * src/MachOWriterExecutable.hpp: <rdar://problem/4434578> set correct n_sect field of stabs
-
-2006-02-15     Nick Kledzik    <kledzik@apple.com>
-
-       * src/MachOReaderArchive.hpp: <rdar://problem/4441920> with -all_load skip over both kinds of SYMDEFs
-       * unit-tests/test-cases/archive-basic/Makefile: add -all_load test case
-
------ Tagged ld64-37
-
-2006-02-13  Eric Christopher  <echristo@apple.com>
-
-       * src/MachOWriterExecutable.hpp (assignFileOffsets): Simplify. Add comments.
-       Adjust whitespace.
-
-2006-02-13     Nick Kledzik    <kledzik@apple.com>
-
-       * src/MachOWriterExecutable.hpp: in Writer<x86>::fixUpReferenceRelocatable() fix kPCRel32 for external case
-
-2006-02-13     Nick Kledzik    <kledzik@apple.com>
-
-       * unit-tests/test-cases/zero-fill: added
-       * src/machochecker.cpp: check that S_ZEROFILL have no file offset
-       * src/MachOWriterExecutable.hpp: rework assignFileOffsets() to fix rdar://problem/4441145
-
-2006-02-12     Nick Kledzik    <kledzik@apple.com>
-
-       * src/MachOReaderRelocatable.hpp: <rdar://problem/4440880> fix use of first zero-length c-string in .o file
-
-2006-02-12     Nick Kledzik    <kledzik@apple.com>
-
-       * src/MachOReaderRelocatable.hpp: <rdar://problem/4440905> fix uninitialized fAlignment
-
-2006-02-12     Nick Kledzik    <kledzik@apple.com>
-
-       * unit-tests/test-cases/relocs-asm/relocs-asm.s: add pointer-diff cases
-       * src/Architectures.hpp: make size explicit in ppc/ppc64 kPointerDiff
-       * src/MachOReaderRelocatable.hpp: don't allow kPointerDiff64 for ppc (just ppc64)
-       * src/MachOWriterExecutable.cpp: set proper r_length for ld -r of kPointerDiff
-
------ Tagged ld64-36
-
-2006-02-08     Nick Kledzik    <kledzik@apple.com>
-
-       * src/MachOReaderRelocatable.cpp: rdar://problem/4438677 Handle when a .o file dwarf line info entries but no functions
-
-2006-02-08     Nick Kledzik    <kledzik@apple.com>
-
-       * src/MachOWriterExecutable.cpp: Properly set address of first TEXT section
-       Keep S_COALESCED attribute for __eh_frame
-
-2006-02-08     Nick Kledzik    <kledzik@apple.com>
-
-       * src/ld.cpp: Temporarily turn allowable client errors into warnings
-       * unit-tests/test-cases/allowable-clientMakefile: Temporarily let warnings be ok for above
-       * src/MachOWriterExecutable.hpp: fix ld -r to not use external relocations for symbols make static
-
-2006-02-08     Nick Kledzik    <kledzik@apple.com>
-
-       * src/ld.cpp: A sibling in an umbrella can always link with its other siblings
-       * unit-tests/test-cases/allowable-client: add test case for above
-
-2006-02-08     Nick Kledzik    <kledzik@apple.com>
-
-       * src/MachOReaderRelocatable.hpp: support LOCAL non-lazy pointers to hidden symbols
-       * src/machochecker.cpp: verify indirect symbol table
-       * unit-tests/test-cases/private-non-lazy: added test case
-
-2006-02-07     Nick Kledzik    <kledzik@apple.com>
-
-       * src/MachOWriterExecutable.hpp: fix calculation of file offsets in ld -r mode
-       * src/machochecker.cpp: verify segment file offsets are within file
-
------ Tagged ld64-35
-
-2006-02-06     Nick Kledzik    <kledzik@apple.com>
-
-       * ld.cpp: allow parent of sub-framework to link
-       * unit-tests/test-cases/allowable-client/Makefile: added cases for parent and clients of parent
-
-2006-02-04     Nick Kledzik    <kledzik@apple.com>
-
-       * unit-tests/test-cases/relocs-c/test.c:  added some array cases
-       * src/MachOReaderRelocatable.hpp: factor out makeReferenceToEH()
-       * src/MachOWriterExecutable.hpp: add initial support for non-lazy pointer synthesis
-
------ Tagged ld64-34
-
-2006-02-04     Nick Kledzik    <kledzik@apple.com>
-
-       * src/ld.cpp: <rdar://problem/4432917> fix -no_arch_warnings
-                                 <rdar://problem/4432932> fix -undefined warning
-                               Do BINCL/EINCL optimization for gfull stabs
-                               Implement "essential symbols" for stabs (-Sp)
-                               Fix allowable clients to only test on direct libraries
-       * src/MachOReaderRelocatable.hpp: support BINCL/EINCL stabs
-
-2006-02-03     Nick Kledzik    <kledzik@apple.com>
-
-       * src/machochecker.cpp: add code to check load command alignment
-       * src/MachOWriterExecutable.hpp: make load command alignment depend on architecture
-
-2006-02-03     Nick Kledzik    <kledzik@apple.com>
-
-       * unit-tests/test-cases/literals-coalesce: added
-       * src/MachOReaderRelocatable.hpp: assure all targets of low14 ppc relocs are at least 4-byte alignmented
-
------ Tagged ld64-33
-
-2006-02-02     Nick Kledzik    <kledzik@apple.com>
-
-       * src/MachOReaderRelocatable.hpp: properly coalesce 8-byte literals
-       * src/MachOWriterExecutable.hpp: support ppc64::kPointerDiff32
-
------ Tagged ld64-32
-
-2006-02-02     Nick Kledzik    <kledzik@apple.com>
-
-       * src/MachOReaderRelocatable.hpp: support anonymous zero fill atoms
-
-2006-02-02     Nick Kledzik    <kledzik@apple.com>
-
-       * src/ld.cpp: A weak definition is good enough, do not search archives for a non-weak one
-       * unit-tests/test-cases/archive-weak: add test case for above
-       * src/MachOReaderRelocatable.hpp: an atom should never have a by-name reference to itself
-       * src/Options.cpp: prevent .eh symbols from being exported via a -exported_symbols_list
-
-2006-02-01     Nick Kledzik    <kledzik@apple.com>
-
-       * src/MachOReaderRelocatable.hpp: Support -macosx_version_min 10.5
-
-2006-02-01     Nick Kledzik    <kledzik@apple.com>
-
-       * src/MachOReaderRelocatable.hpp: don't try to parse debug_line dwarf if no symboled atoms
-
------ Tagged ld64-31
-
-2006-02-01  Eric Christopher  <echristo@apple.com>
-
-       * unit-tests/test-cases/allow-stack-execute/Makefile: Move otool handling...
-       * unit-tests/include/common.makefile: ... here.
-       * unit-tests/bin/fail-if-stdin.pl: New.
-       * unit-tests/test-cases/no-uuid: Ditto.
-       * src/ld.cpp (Linker::) Add fCreateUUID.
-       (::Linker): Initialize.
-       (::collectStabs): Use. Set if dwarf or we have a UUID already.
-       (::writeOutput): Pass as argument to Writer::write along with option.
-       * src/Options.h (Option::emitUUID): Declare.
-       (Option::fEmitUUID): Ditto.
-       * src/Options.cpp (Option::emitUUID): New.
-       (parse): Handle -no_uuid.
-       * src/MachOReaderRelocatable (Reader::Reader): Handle LC_UUID.
-       * src/ExecutableFile.h (Writer::Write): Add createUUID boolean.
-       * src/MachOWriterExecutable: Add UUID forward declaration.
-       (fUUIDAtom): New.
-       (UUIDLoadCommandAtom): Emit LC_UUID if fEmit. New function emit. Size
-       to zero at start.
-       (Writer::writer): Add handle for LC_UUID. If createUUID emit LC_UUID.
-       (MachHeaderAtom::copyRawContent): Don't count a load command if its size is
-       0.
-       (UUIDLoadCommandAtom::copyRawContent): Depend on fEmit.
-
-
-2006-01-31     Nick Kledzik    <kledzik@apple.com>
-
-       * unit-tests/test-cases/dwarf-debug-notes : Added
-       * src/ld.cpp: don't generate debug note for .eh symbols
-       * src/MachOReaderRelocatable.hpp: make dwarf line info to atom matching faster and better
-
-2006-01-31     Nick Kledzik    <kledzik@apple.com>
-
-       * ld64.xcodeproj/project.pbxproj : Make buildable on Leopard
-       * src/MachOFileAbstraction.hpp: make buildable without latest cctools headers
-
-2006-01-31     Nick Kledzik    <kledzik@apple.com>
-
-       * src/MachOReaderRelocatable.hpp: better error message for bad relocs
-       * src/ObjectDump.cpp: add emacs tab settings
-       * src/SectCreate.h: ditto
-       * src/SectCreate.cpp: ditto
-       * src/machochecker.cpp: ditto
-       * src/ExecutableFile.h: ditto
-
-2006-01-30  Eric Christopher  <echristo@apple.com>
-
-       * src/ExecutableFile.h: Indent.
-
-2006-01-30     Nick Kledzik    <kledzik@apple.com>
-
-       * src/MachOReaderRelocatable.hpp: performance improvements
-       * src/ld.cpp: now that stubs are synthesized in write, don't need to special case anymore
-
-2006-01-30     Nick Kledzik    <kledzik@apple.com>
-
-       * src/MachOReaderRelocatable.hpp: fix parsing of pcc relocs
-       * unit-tests/test-cases/relocs-asm/relocs-asm.s: add test case for above
-
-2006-01-29     Nick Kledzik    <kledzik@apple.com>
-
-       * unit-tests/test-cases/weak_import: added test case
-       * src/ld.cpp: move code for weak_import mismatch to writer
-       * src/ObjectFile.h: remove ImportWeakness methods
-       * src/MachOReaderDylib.hpp: ditto
-       * src/SectCreate.cpp: ditto
-       * src/Architectures.hpp: add new ReferenceKinds for weak_imports
-       * src/MachOReaderRelocatable.hpp: implement new ReferenceKinds
-       * src/MachOWriterExecutable.hpp: handle new ReferenceKinds and weak_import mismatches
-
-2006-01-29     Nick Kledzik    <kledzik@apple.com>
-
-       * src/Options.cpp: verify -allow_stack_execute is only used on main executables
-
-2006-01-29     Nick Kledzik    <kledzik@apple.com>
-
-       * src/MachOReaderRelocatable.hpp: sync with latest dwarf reader from Geoff
-       * src/debugline.c: sync with latest dwarf reader from Geoff
-
-2006-01-27  Eric Christopher  <echristo@apple.com>
-
-       * src/ld.cpp (Linker::syntesizeStabs): Correct spelling. Update all uses.
-
-2006-01-27  Eric Christopher  <echristo@apple.com>
-
-       * src/Options.h (Options): Add hasExecutableStack, fExecutableStack.
-       * src/Options.cpp (Options::hasExecutableStack): New.
-       (Options::parse): Parse -allow_stack_execute.
-       * src/MachOWriterExecutable.hpp (MachHeaderAtom::copyRawContent):
-       Implement MH_ALLOW_STACK_EXECUTION.
-       * unit-tests/include/common.makefile (FAIL_IF_EMPTY): New.
-       * unit-tests/bin/fail-if-no-stdin.pl: New file.
-       * unit-tests/test-cases/allow-stack-execute: New directory.
-
-2006-01-27     Nick Kledzik    <kledzik@apple.com>
-
-       * src/MachOFileAbstraction.hpp: rely on latest system headers
-       * src/MachOWriterExecutable.hpp: fix ppc stubs.
-               wrote new relocationNeededInFinalLinkedImage() to replace common code
-
-2006-01-27  Eric Christopher  <echristo@apple.com>
-
-       * src/ld.cpp (logTraceInfo): New.
-       (Linker::addArchive): Use.
-       (Linker::addDylib): Ditto.
-       * src/ObjectFile (ReaderOptions::fTraceOutputFile): New.
-       * src/MachOReaderArchive.hpp (Reader::Reader): Move trace
-       logging to Linker::addArchive.
-       * src/Options.cpp (parsePreCommandLineEnvironment): Check
-       LD_PRINT_FILE if tracing dylibs or archives.
-
-2006-01-26     Nick Kledzik    <kledzik@apple.com>
-
-       * src/MachOWriterExecutable.hpp: handle NULL strings in SO debug notes
-
-2006-01-26     Nick Kledzik    <kledzik@apple.com>
-
-       * src/MachOWriterExecutable.hpp: fix header padding calculation and thread state
-
-2006-01-26     Nick Kledzik    <kledzik@apple.com>
-
-       Rewrite all stabs processing.
-       Move sythesize of debug notes into ld.cpp
-
-2006-01-26     Nick Kledzik    <kledzik@apple.com>
-
-       * src/MachOWriterExecutable.hpp: fix ppc and ppc64 stub relocs
-
-2006-01-25     Nick Kledzik    <kledzik@apple.com>
-
-       * ld64.xcodeproj/project.pbxproj: special case building in Curry
-
-2006-01-25     Nick Kledzik    <kledzik@apple.com>
-
-       * src/MachOWriterExecutable.hpp: fix bugs in stub/lazy-pointer synthesis
-
-2006-01-24  Eric Christopher  <echristo@apple.com>
-
-       * src/ld.cpp (Linker::createReaders): Change logging title to XBS.
-       (Linker::addDylib): Ditto.
-       * src/MachOReaderArchive.hpp (Reader::Reader): Ditto.
-       * src/Options.h (fPrintOptions): New.
-       * src/Options.cpp (Options::Options): Initialize above.
-       (Options::checkForFile): Change logging title to XBS.
-       (Options::findFramework): Ditto.
-       (Options::parse): Add log for options.
-       (Options::parsePreCommandLineEnvironmentSettings): Add LD_TRACE_ARCHIVES,
-       LD_TRACE_DYLIBS, and LD_PRINT_OPTIONS.
-
-2006-01-24     Nick Kledzik    <kledzik@apple.com>
-
-       * src/MachOReaderRelocatable.hpp: better C++ eh parsing
-
-2006-01-23  Eric Christopher  <echristo@apple.com>
-
-       * unit-tests/bin/fail-if-exit-zero.pl: New.
-       * unit-tests/include/common.makefile (FAIL_IF_SUCCESS): Use.
-       * unit-tests/allowable-client: New test.
-       * src/ld.cpp (Linker::addDylib): Check allowable clients before adding dylib.
-       * src/Options.h (allowableClients): New.
-       (clientName): Ditto.
-       (fAllowableClients): Ditto.
-       (fClientName): Ditto.
-       * src/Options.cpp: Implement above.
-       (parse): Handle -allowable_client and -client_name.
-       * src/MachOReaderDylib.hpp (getAllowableClients): New.
-       (fAllowableClients): Ditto.
-       (Reader): Process LC_SUB_CLIENT load command.
-       * src/ObjectFile.h (parentUmbrella): New.
-       (getAllowableClients): New.
-       * src/MachOWriterExecutable.hpp (AllowableClientLoadCommandsAtom): New.
-
-2006-01-23     Nick Kledzik    <kledzik@apple.com>
-
-       * unit-tests/test-cases/archive-basic: added
-       * src/ld.cpp: fix shadowed local variable
-       * src/FileAbstraction.hpp: <rdar://problem/4417372> ld64 shouldn't inline when building debug
-
-2006-01-23     Nick Kledzik    <kledzik@apple.com>
-
-       * src/ld.cpp: fix symbol not found error message
-       * src/MachOReaderDylib.hpp: add logging to hash table
-       * src/MachOReaderRelocatable.hpp: enable stabs processing. Handle static functions with stubs
-                                                                       handle labeled cstrings.
-       * src/MachOWriterExecutable.hpp: properly suppress atoms not in symbol table. fix low14 error check.
-                                                                       add StubAtomHelper.
-       * unit-tests/test-cases/relocs-literals/test.c: add more interesting edge cases
-
-2006-01-17     Nick Kledzik    <kledzik@apple.com>
-
-       * src/MachOReaderRelocatable.hpp: tweaks to synthesizing debug notes
-
-2006-01-16     Nick Kledzik    <kledzik@apple.com>
-
-       * src/debugline.{sh}: added
-       * src/MachOReaderRelocatable.hpp: synthesize debug notes SOL from dwarf
-       * src/MachOWriterExecutable.hpp: fix lazy pointer section
-       * src/ObjectDump.hpp: Fix conditionalization
-       * unit-tests/test-cases/dwarf-strip: added
-
-2006-01-11     Nick Kledzik    <kledzik@apple.com>
-
-       * src/MachOReaderRelocatable.hpp: support Tiger crt1.o build with old ld64
-       * src/ObjectDump.hpp: Support -arch option
-
-2006-01-10     Nick Kledzik    <kledzik@apple.com>
-
-       * src/MachOWriterExecutable.hpp: fix stubs for ppc64
-       * src/MachOFileAbstraction.hpp: fix typo for macho_routines
-       * ld64.xcodeproj/project.pbxproj: add machochecker target
-       * src/machochecker.cpp: new skeleton for checking mach-o file bit
-       * unit-tests/: Add support for running machochecker
-
-2006-01-10     Nick Kledzik    <kledzik@apple.com>
-
-       * src/MachOReaderRelocatable.hpp: warn if dwarf can't be parsed
-       * src/MachOReaderArchive.hpp: modTime for OSO stabs from archives is .a modTime
-
-2006-01-09     Nick Kledzik    <kledzik@apple.com>
-
-       * track modification time of .o files so that sythesized OSO stab will have it
-
-2006-01-09     Nick Kledzik    <kledzik@apple.com>
-
-       * src/MachOFileAbstraction.hpp: add macho_uuid_command
-       * src/MachOWriterExecutable.cpp: add UUID load command to generated files
-
-2006-01-09     Nick Kledzik    <kledzik@apple.com>
-
-       * src/MachOReaderDylib.hpp: no longer keep dylib memory mapped
-       * src/ld.cpp: don't track dylib sizes because they are not longer memory mapped
-
-2006-01-05     Nick Kledzik    <kledzik@apple.com>
-
-       * src/MachOReaderRelocatable.hpp: support new relocations
-
-2006-01-05     Nick Kledzik    <kledzik@apple.com>
-
-       * src/MachOReaderDylib.hpp: support MH_DYLIB_STUB
-       * src/MachOReaderRelocatable.hpp: Add Geoff's comp unit extractor
-
-2006-01-05     Nick Kledzik    <kledzik@apple.com>
-
-       refactor: transform Atom::dontStripName() to getSymbolTableInclusion()
-       * src/ld.cpp: pass dyld_stub_binding_helper to writer
-       * src/MachOReaderRelocatable.hpp: update synthesized stabs
-         Ignore stubs and lazy pointers in .o files
-         Support initializers and terminators
-       * src/MachOWriterExecutable.hpp: synthesize stubs and lazy pointers as needed
-       * ld64.xcodeproj/project.pbxproj: change Release target to build with dwarf
-
-2006-01-03  Eric Christopher  <echristo@apple.com>
-
-       * src/Options.h (multipleDefinitionsInDylibs): Declare.
-       (overridingDefinitionInDependentDylib): Ditto.
-       (warnOnMultipleDefinitionsInObjectFiles): Ditto.
-       (multiplyDefined): Remove.
-       (multiplyDefinedUnused): Ditto.
-       (fMultiplyDefined): Ditto.
-       (fWarnOnMultiplyDefined): New.
-       (fMultiplyDefinedDynamic): Ditto.
-       * src/Options.cpp (Options::Options): Initialize above.
-       (overridingDefinitionInDependentDylib): New.
-       (multipleDefinitionsInDylibs): Ditto.
-       (warnOnMultipleDefinitionsInObjectFiles): Ditto.
-       (parse): Update comments. Fix parsing of -y option.
-       Update error message for -dead_strip. Parse above
-       options.
-
-2006-01-02     Nick Kledzik    <kledzik@apple.com>
-
-       * Refactor: move Atom::writeContent() to Writer
-
-2005-12-23     Nick Kledzik    <kledzik@apple.com>
-
-       * Reworked, simplify, and document test harness
-       * unit-tests/README: Added
-
-2005-12-23     Nick Kledzik    <kledzik@apple.com>
-
-       * src/MachOReaderRelocatable.hpp: fixes for Objective-C
-       * unit-tests/test-cases/relocs-objc: Added
-
-2005-12-22     Nick Kledzik    <kledzik@apple.com>
-
-       * src/MachOReaderRelocatable.hpp: fix check that next reloc is pair
-       * src/MachOReaderRelocatable.hpp: Add code to synthesize essential stabs from dwarf
-
-2005-12-21     Nick Kledzik    <kledzik@apple.com>
-
-       * src/MachOReaderRelocatable.hpp: Fix parsing of literal sections
-       * src/MachOWriterExecutable.hpp: Fix writing of literal sections
-       * unit-tests/test-cases/relocs-literals: Added
-
-2005-12-15  Eric Christopher  <echristo@apple.com>
-
-       * src/Options.h (enum Treatment): New.
-       (enum PICTreatment): Delete.
-       (enum VersionMin): New.
-       (prebind): Declare.
-       (macosxVersionMin): Ditto.
-       (multiplyDefined): Ditto.
-       (multiplyDefinedUnused): Ditto.
-       (setVersionMin): Ditto.
-       (setPICTreatment): Delete.
-       (setReadOnlyRelocTreatment): Ditto.
-       (picTreatment): Adjust return type.
-       (parseTreatment): New.
-       (fPrebind): Ditto.
-       (fVersionMin): Ditto.
-       (fPICTreatment): Change type.
-       (fMultiplyDefined): New.
-       (fMultiplyDefinedUnused): Ditto.
-       (fLimitUndefinedSymbols): Ditto.
-
-       * src/Options.cpp: Fix whitespace. Add comments on options.
-       (Options::Options): Add initializers for new variables.
-       (Options::prebind): New.
-       (Options::macosxVersionMin): Ditto.
-       (Options::parseTreatment): Ditto.
-       (Options::setVersionMin): Ditto.
-       (Options::setReadOnlyRelocTreatment): Delete.
-       (Options::setPICTreatment): Ditto.
-       (Options::Parse): Update for above. Add comments.
-
-2005-12-15     Nick Kledzik    <kledzik@apple.com>
-
-       * src/MachOReaderRelocatable.hpp: Add comments about dwarf
-
-2005-12-14     Nick Kledzik    <kledzik@apple.com>
-
-       * src/ELFFileAbstraction.hpp: Added
-       * src/ELFReaderRelocatable.hpp: Added
-       * Lot of fixes for new architecture
-       * Added __OPEN_SOURCE__ to "Preprocessor Macros" to disable new architecture support by default
-
-2005-12-13     Nick Kledzik    <kledzik@apple.com>
-
-       * src/MachOReaderRelocatable.hpp: check for S_ATTR_DEBUG and ignore those sections
-       * unit-tests/test-cases/dwarf-ignore: added
-
-2005-12-12     Nick Kledzik    <kledzik@apple.com>
-
-       * Added test harness and three initial tests:
-               relocs-asm, relocs-c, and hello-world
-
-2005-12-12     Nick Kledzik    <kledzik@apple.com>
-
-       * src/MachOReaderRelocatable.hpp: Massive refactoring:
-               Now there are three Atom classes, Chopping into Atoms
-               is done on label boundaries or by knowledge of special
-               sections, Share lots of ppc/ppc64 code.
-       Stabs process code is temporarily disabled.
-
-2005-12-12     Nick Kledzik    <kledzik@apple.com>
-
-       * src/ObjectDump.cpp: Add command line options: -no_content, -stabs, -no_sort
-
-2005-12-11  Eric Christopher  <echristo@apple.com>
-
-       * src/Options.cpp: Reformat.
-       * src/Options.h: Ditto.
-
-2005-12-07  Eric Christopher  <echristo@apple.com>
-
-       * src/MachOReaderRelocatable.hpp (Atom::getAlignment):
-       When calculating alignment of an Atom, take into account
-       the alignment from which we pulled the Atom.
-
-2005-12-06     Nick Kledzik    <kledzik@apple.com>
-
-       * src/Options.cpp src/Options.h: Add design comments
-
-2005-12-05  Eric Christopher  <echristo@apple.com>
-
-       * src/ld.cpp (Linker::createWriter): Uncomment ppc64 and
-       i386 linkers.
-
-2005-12-05  Eric Christopher  <echristo@apple.com>
-
-       * ChangeLog: New file.
-
-2005-12-02     Nick Kledzik    <kledzik@apple.com>
-
-       * src/ObjectFile.h: Add design comments
-
-2005-11-30     Nick Kledzik    <kledzik@apple.com>
-
-       * Fix uses of __OPEN_SOURCE__
-
-2005-11-28     Nick Kledzik    <kledzik@apple.com>
-
-       * Refactor Atom to use getDefinitionKind()
-
-2005-11-21     Nick Kledzik    <kledzik@apple.com>
-
-       * src/MachOWriterExecutable.hpp: don't generate section for commons in -r mode
-
-2005-11-18     Nick Kledzik    <kledzik@apple.com>
-
-       * x86 tweaks
-
-2005-11-18     Nick Kledzik    <kledzik@apple.com>
-
-       * src/ObjectDump.cpp: make work with command line arguments
-
-2005-11-18     Nick Kledzik    <kledzik@apple.com>
-
-       * Massive rework to remove preprocessor conditionals and use templates
-
-2005-11-14     Nick Kledzik    <kledzik@apple.com>
-
-       * Created new Subversion repository for ld64 from cvs tag ld64-27.2
index c910e048ae1e88aaf32fec4f586f8cdbf28f2ff9..3a84e0a66eec5dbb7704475af3b00ffb8d955402 100644 (file)
@@ -271,6 +271,10 @@ When targeting Mac OS X 10.6 or later, the format of the exported symbol informa
 make lookups of popular symbols faster.  This option is used to pass a file containing a list of
 the symbols most frequently used by clients of the dynamic library being built. Not all exported symbols
 need to be listed.  
 make lookups of popular symbols faster.  This option is used to pass a file containing a list of
 the symbols most frequently used by clients of the dynamic library being built. Not all exported symbols
 need to be listed.  
+.It Fl no_zero_fill_sections
+By default the linker moves all zero fill sections to the end of the __DATA segment and configures
+them to use no space on disk.  This option suppresses that optimization, so zero-filled data occupies
+space on disk in a final linked image.
 .El
 .Ss Options when creating a dynamic library (dylib) 
 .Bl -tag
 .El
 .Ss Options when creating a dynamic library (dylib) 
 .Bl -tag
index ceb448a472b088b1d23bbbebf9d87fb03bfebf01..0d141cf0b9c4dc751b6f609f7bec0fda59217754 100644 (file)
@@ -61,7 +61,7 @@ struct x86
        
        enum ReferenceKinds {  kNoFixUp, kFollowOn, kGroupSubordinate, kPointer, kPointerWeakImport, kPointerDiff, kPointerDiff32=kPointerDiff, kPointerDiff16,
                                                        kPCRel32, kPCRel32WeakImport, kAbsolute32,  kPCRel16, kPCRel8, 
        
        enum ReferenceKinds {  kNoFixUp, kFollowOn, kGroupSubordinate, kPointer, kPointerWeakImport, kPointerDiff, kPointerDiff32=kPointerDiff, kPointerDiff16,
                                                        kPCRel32, kPCRel32WeakImport, kAbsolute32,  kPCRel16, kPCRel8, 
-                                                       kImageOffset32, kPointerDiff24, kSectionOffset24,
+                                                       kImageOffset32, kPointerDiff24,
                                                        kDtraceProbe, kDtraceProbeSite, kDtraceIsEnabledSite, kDtraceTypeReference  };
 };
 
                                                        kDtraceProbe, kDtraceProbeSite, kDtraceIsEnabledSite, kDtraceTypeReference  };
 };
 
@@ -74,7 +74,7 @@ struct x86_64
                                                        kBranchPCRel32, kBranchPCRel32WeakImport,
                                                        kPCRel32GOTLoad, kPCRel32GOTLoadWeakImport,
                                                        kPCRel32GOT, kPCRel32GOTWeakImport, kBranchPCRel8, kGOTNoFixUp, 
                                                        kBranchPCRel32, kBranchPCRel32WeakImport,
                                                        kPCRel32GOTLoad, kPCRel32GOTLoadWeakImport,
                                                        kPCRel32GOT, kPCRel32GOTWeakImport, kBranchPCRel8, kGOTNoFixUp, 
-                                                       kImageOffset32, kPointerDiff24, kSectionOffset24,
+                                                       kImageOffset32, kPointerDiff24,
                                                        kDtraceProbe, kDtraceProbeSite, kDtraceIsEnabledSite, kDtraceTypeReference  };
 };
 
                                                        kDtraceProbe, kDtraceProbeSite, kDtraceIsEnabledSite, kDtraceTypeReference  };
 };
 
@@ -83,7 +83,7 @@ struct arm
        typedef Pointer32<LittleEndian>         P;
        
        enum ReferenceKinds {  kNoFixUp, kFollowOn, kGroupSubordinate, kPointer, kPointerWeakImport, kPointerDiff, kPointerDiff32=kPointerDiff, kReadOnlyPointer,
        typedef Pointer32<LittleEndian>         P;
        
        enum ReferenceKinds {  kNoFixUp, kFollowOn, kGroupSubordinate, kPointer, kPointerWeakImport, kPointerDiff, kPointerDiff32=kPointerDiff, kReadOnlyPointer,
-                                                       kBranch24, kBranch24WeakImport, kThumbBranch22, kThumbBranch22WeakImport,
+                                                       kBranch24, kBranch24WeakImport, kThumbBranch22, kThumbBranch22WeakImport, 
                                                        kDtraceProbe, kDtraceProbeSite, kDtraceIsEnabledSite, kDtraceTypeReference  };
 };
 
                                                        kDtraceProbe, kDtraceProbeSite, kDtraceIsEnabledSite, kDtraceTypeReference  };
 };
 
index 1b8f2c3fe815c3e70e830050d3719760715d0fd5..75659e1ed68d5c2d977911c1dcc2fbace238ccca 100644 (file)
@@ -358,7 +358,6 @@ Reader::Reader(const uint8_t* fileContent, uint64_t fileLength, const char* path
                                kind = ObjectFile::Atom::kWeakDefinition;
                                break;
                        case LTO_SYMBOL_DEFINITION_UNDEFINED:
                                kind = ObjectFile::Atom::kWeakDefinition;
                                break;
                        case LTO_SYMBOL_DEFINITION_UNDEFINED:
-                       case LTO_SYMBOL_DEFINITION_WEAKUNDEF:
                                kind = ObjectFile::Atom::kExternalDefinition;
                                break;
                        default:
                                kind = ObjectFile::Atom::kExternalDefinition;
                                break;
                        default:
@@ -407,7 +406,7 @@ const char* Reader::tripletPrefixForArch(cpu_type_t arch)
                case CPU_TYPE_X86_64:
                        return "x86_64-";
                case CPU_TYPE_ARM:
                case CPU_TYPE_X86_64:
                        return "x86_64-";
                case CPU_TYPE_ARM:
-                       return "arm";
+                       return "arm-";
        }
        return "";
 }
        }
        return "";
 }
index 8aea6efd66f65541c27ed9b6126e3bf8c7605aee..13faf3d45cb29cc5e4e0f83398bef621f50b53b1 100644 (file)
@@ -780,18 +780,13 @@ void Reader<A>::processIndirectLibraries(DylibHander* handler)
                                                //fprintf(stderr, "processIndirectLibraries() implicitly linking %s\n", child->getInstallPath());
                                                ((Reader<A>*)child)->setImplicitlyLinked();
                                        }
                                                //fprintf(stderr, "processIndirectLibraries() implicitly linking %s\n", child->getInstallPath());
                                                ((Reader<A>*)child)->setImplicitlyLinked();
                                        }
-                                       else if ( child->explicitlyLinked() || child->implicitlyLinked() ) {
-                                               //fprintf(stderr, "processIndirectLibraries() parent is not directly linked, but child is, so no need to re-export child\n");
-                                       }
-                                       else {
+                                       else
                                                fReExportedChildren.push_back(child);
                                                fReExportedChildren.push_back(child);
-                                               //fprintf(stderr, "processIndirectLibraries() parent is not directly linked, so parent=%s will re-export child=%s\n", this->getInstallPath(), it->path);
-                                       }
                                }
                                else {
                                        // add all child's symbols to me
                                        fReExportedChildren.push_back(child);
                                }
                                else {
                                        // add all child's symbols to me
                                        fReExportedChildren.push_back(child);
-                                       //fprintf(stderr, "processIndirectLibraries() child is not public, so parent=%s will re-export child=%s\n", this->getInstallPath(), it->path);
+                                       //fprintf(stderr, "processIndirectLibraries() parent=%s will re-export child=%s\n", this->getInstallPath(), it->path);
                                }
                        }
                        else if ( !fExplictReExportFound ) {
                                }
                        }
                        else if ( !fExplictReExportFound ) {
index e57631322cdfe1dab3cc739da999c87acc665b49..ef8cfb2729e413143087f1560cb3d96467052e3f 100644 (file)
@@ -288,6 +288,7 @@ public:
        virtual uint32_t                                                        getOrdinal() const { return fOrdinal; }
        virtual void                                                            setOrdinal(uint32_t value) { fOrdinal = value; }
        virtual const void*                                                     getSectionRecord() const = 0;
        virtual uint32_t                                                        getOrdinal() const { return fOrdinal; }
        virtual void                                                            setOrdinal(uint32_t value) { fOrdinal = value; }
        virtual const void*                                                     getSectionRecord() const = 0;
+       virtual unsigned int                                            getSectionIndex() const = 0;
        virtual bool                                                            isAlias() const { return false; }
        virtual uint8_t                                                         getLSDAReferenceKind() const { return 0; }
        virtual uint8_t                                                         getPersonalityReferenceKind() const { return 0; }
        virtual bool                                                            isAlias() const { return false; }
        virtual uint8_t                                                         getLSDAReferenceKind() const { return 0; }
        virtual uint8_t                                                         getPersonalityReferenceKind() const { return 0; }
@@ -295,7 +296,6 @@ public:
        virtual ObjectFile::UnwindInfo::iterator        beginUnwind()                                   { return fHasCompactUnwindInfo ? &fSingleUnwindInfo[0] : NULL; }
        virtual ObjectFile::UnwindInfo::iterator        endUnwind()                                             { return fHasCompactUnwindInfo ? &fSingleUnwindInfo[1] : NULL; }
        virtual ObjectFile::Reference*                          getLSDA();
        virtual ObjectFile::UnwindInfo::iterator        beginUnwind()                                   { return fHasCompactUnwindInfo ? &fSingleUnwindInfo[0] : NULL; }
        virtual ObjectFile::UnwindInfo::iterator        endUnwind()                                             { return fHasCompactUnwindInfo ? &fSingleUnwindInfo[1] : NULL; }
        virtual ObjectFile::Reference*                          getLSDA();
-       virtual ObjectFile::Reference*                          getFDE();
        virtual Atom*                                                           getPersonalityPointer();
        virtual void                                                            setCompactUnwindEncoding(uint64_t ehAtomAddress);
 
        virtual Atom*                                                           getPersonalityPointer();
        virtual void                                                            setCompactUnwindEncoding(uint64_t ehAtomAddress);
 
@@ -320,19 +320,6 @@ ObjectFile::Reference* BaseAtom::getLSDA()
        return NULL;
 }
 
        return NULL;
 }
 
-ObjectFile::Reference* BaseAtom::getFDE()
-{
-       const uint8_t groupKind = this->getLSDAReferenceKind(); 
-       const std::vector<ObjectFile::Reference*>& refs = this->getReferences();
-       for (std::vector<ObjectFile::Reference*>::const_iterator it=refs.begin(); it != refs.end(); it++) {
-               ObjectFile::Reference* ref = *it;
-               if ( (ref->getKind() == groupKind) && (ref->getTarget().getContentType() == ObjectFile::Atom::kCFIType) ) {
-                       return ref;
-               }
-       }
-       return NULL;
-}
-
 ObjectFile::Atom* BaseAtom::getPersonalityPointer()
 {
        const uint8_t personalityKind = this->getPersonalityReferenceKind(); 
 ObjectFile::Atom* BaseAtom::getPersonalityPointer()
 {
        const uint8_t personalityKind = this->getPersonalityReferenceKind(); 
@@ -397,21 +384,36 @@ public:
                        else if ( rightAlias ) {
                                return false;
                        }
                        else if ( rightAlias ) {
                                return false;
                        }
-                       else {
-                               // they must be tentative defintions
-                               switch ( left->getDefinitionKind() ) {
-                                       case ObjectFile::Atom::kTentativeDefinition:
-                                               // sort tentative definitions by name
-                                               return ( strcmp(left->getName(), right->getName()) < 0 );
-                                       case ObjectFile::Atom::kAbsoluteSymbol:
-                                               // sort absolute symbols with same address by name
-                                               return ( strcmp(left->getName(), right->getName()) < 0 );
-                                       default:
-                                               // hack for rdar://problem/5102873
-                                               if ( !left->isZeroFill() || !right->isZeroFill() )
-                                                       warning("atom sorting error for %s and %s in %s", left->getDisplayName(), right->getDisplayName(), left->getFile()->getPath());
-                                               break;
-                               }
+                       // one might be a section start or end label
+                       switch ( left->getContentType() ) {
+                               case ObjectFile::Atom::kSectionStart:
+                                       return true;
+                               case ObjectFile::Atom::kSectionEnd:
+                                       return false;
+                               default:
+                                       break;
+                       }
+                       switch ( right->getContentType() ) {
+                               case ObjectFile::Atom::kSectionStart:
+                                       return false;
+                               case ObjectFile::Atom::kSectionEnd:
+                                       return true;
+                               default:
+                                       break;
+                       }
+                       // they could be tentative defintions
+                       switch ( left->getDefinitionKind() ) {
+                               case ObjectFile::Atom::kTentativeDefinition:
+                                       // sort tentative definitions by name
+                                       return ( strcmp(left->getName(), right->getName()) < 0 );
+                               case ObjectFile::Atom::kAbsoluteSymbol:
+                                       // sort absolute symbols with same address by name
+                                       return ( strcmp(left->getName(), right->getName()) < 0 );
+                               default:
+                                       // hack for rdar://problem/5102873
+                                       if ( !left->isZeroFill() || !right->isZeroFill() )
+                                               warning("atom sorting error for %s and %s in %s", left->getDisplayName(), right->getDisplayName(), left->getFile()->getPath());
+                                       break;
                        }
                }
                return false;
                        }
                }
                return false;
@@ -439,7 +441,7 @@ public:
        virtual ObjectFile::Atom::ContentType           getContentType() const                  { return fType; }
        virtual SymbolTableInclusion                            getSymbolTableInclusion() const { return fSymbolTableInclusion; }
        virtual bool                                                            dontDeadStrip() const;
        virtual ObjectFile::Atom::ContentType           getContentType() const                  { return fType; }
        virtual SymbolTableInclusion                            getSymbolTableInclusion() const { return fSymbolTableInclusion; }
        virtual bool                                                            dontDeadStrip() const;
-       virtual bool                                                            isZeroFill() const                              { return ((fSection->flags() & SECTION_TYPE) == S_ZEROFILL); }
+       virtual bool                                                            isZeroFill() const;
        virtual bool                                                            isThumb() const                                 { return ((fSymbol->n_desc() & N_ARM_THUMB_DEF) != 0); }
        virtual uint64_t                                                        getSize() const                                 { return fSize; }
        virtual std::vector<ObjectFile::Reference*>&  getReferences() const                     { return (std::vector<ObjectFile::Reference*>&)(fReferences); }
        virtual bool                                                            isThumb() const                                 { return ((fSymbol->n_desc() & N_ARM_THUMB_DEF) != 0); }
        virtual uint64_t                                                        getSize() const                                 { return fSize; }
        virtual std::vector<ObjectFile::Reference*>&  getReferences() const                     { return (std::vector<ObjectFile::Reference*>&)(fReferences); }
@@ -458,6 +460,7 @@ public:
        virtual const ObjectFile::ReaderOptions&        getOptions() const                              { return fOwner.fOptions; }
        virtual uint64_t                                                        getObjectAddress() const                { return fAddress; }
        virtual const void*                                                     getSectionRecord() const                { return (const void*)fSection; }
        virtual const ObjectFile::ReaderOptions&        getOptions() const                              { return fOwner.fOptions; }
        virtual uint64_t                                                        getObjectAddress() const                { return fAddress; }
        virtual const void*                                                     getSectionRecord() const                { return (const void*)fSection; }
+       virtual unsigned int                                            getSectionIndex() const                 { return 1 + (fSection - fOwner.fSectionsStart); }
        virtual uint8_t                                                         getLSDAReferenceKind() const;
        virtual uint8_t                                                         getPersonalityReferenceKind() const;
        virtual uint32_t                                                        getCompactUnwindEncoding(uint64_t ehAtomAddress);
        virtual uint8_t                                                         getLSDAReferenceKind() const;
        virtual uint8_t                                                         getPersonalityReferenceKind() const;
        virtual uint32_t                                                        getCompactUnwindEncoding(uint64_t ehAtomAddress);
@@ -643,6 +646,12 @@ ObjectFile::Atom& SymbolAtom<A>::getFollowOnAtom() const
        return *((ObjectFile::Atom*)NULL);
 }
 
        return *((ObjectFile::Atom*)NULL);
 }
 
+template <typename A>
+bool SymbolAtom<A>::isZeroFill() const
+{
+       return ( ((fSection->flags() & SECTION_TYPE) == S_ZEROFILL) && fOwner.fOptions.fOptimizeZeroFill );
+}
+
 
 class Beyond
 {
 
 class Beyond
 {
@@ -717,6 +726,7 @@ public:
        virtual const ObjectFile::ReaderOptions&        getOptions() const                              { return fAliasOf.getOptions(); }
        virtual uint64_t                                                        getObjectAddress() const                { return fAliasOf.getObjectAddress(); }
        virtual const void*                                                     getSectionRecord() const                { return fAliasOf.getSectionRecord(); }
        virtual const ObjectFile::ReaderOptions&        getOptions() const                              { return fAliasOf.getOptions(); }
        virtual uint64_t                                                        getObjectAddress() const                { return fAliasOf.getObjectAddress(); }
        virtual const void*                                                     getSectionRecord() const                { return fAliasOf.getSectionRecord(); }
+       virtual unsigned int                                            getSectionIndex() const                 { return fAliasOf.getSectionIndex(); }
        virtual bool                                                            isAlias() const                                 { return true; }
 
 protected:
        virtual bool                                                            isAlias() const                                 { return true; }
 
 protected:
@@ -778,7 +788,7 @@ public:
        virtual const char*                                                     getDisplayName() const                  { return getName(); }
        virtual ObjectFile::Atom::Scope                         getScope() const                                { return fScope; }
        virtual ObjectFile::Atom::DefinitionKind        getDefinitionKind() const               { return ObjectFile::Atom::kTentativeDefinition; }
        virtual const char*                                                     getDisplayName() const                  { return getName(); }
        virtual ObjectFile::Atom::Scope                         getScope() const                                { return fScope; }
        virtual ObjectFile::Atom::DefinitionKind        getDefinitionKind() const               { return ObjectFile::Atom::kTentativeDefinition; }
-       virtual bool                                                            isZeroFill() const                              { return true; }
+       virtual bool                                                            isZeroFill() const                              { return fOwner.fOptions.fOptimizeZeroFill; }
        virtual bool                                                            isThumb() const                                 { return false; }
        virtual SymbolTableInclusion                            getSymbolTableInclusion() const { return ((fSymbol->n_desc() & REFERENCED_DYNAMICALLY) != 0)
                                                                                                                                                                                ? ObjectFile::Atom::kSymbolTableInAndNeverStrip : ObjectFile::Atom::kSymbolTableIn; }
        virtual bool                                                            isThumb() const                                 { return false; }
        virtual SymbolTableInclusion                            getSymbolTableInclusion() const { return ((fSymbol->n_desc() & REFERENCED_DYNAMICALLY) != 0)
                                                                                                                                                                                ? ObjectFile::Atom::kSymbolTableInAndNeverStrip : ObjectFile::Atom::kSymbolTableIn; }
@@ -800,6 +810,7 @@ public:
        virtual const ObjectFile::ReaderOptions&        getOptions() const                              { return fOwner.fOptions; }
        virtual uint64_t                                                        getObjectAddress() const                { return ULLONG_MAX; }
        virtual const void*                                                     getSectionRecord() const                { return NULL; }
        virtual const ObjectFile::ReaderOptions&        getOptions() const                              { return fOwner.fOptions; }
        virtual uint64_t                                                        getObjectAddress() const                { return ULLONG_MAX; }
        virtual const void*                                                     getSectionRecord() const                { return NULL; }
+       virtual unsigned int                                            getSectionIndex() const                 { return 0; }
 
 protected:
        typedef typename A::P                                   P;
 
 protected:
        typedef typename A::P                                   P;
@@ -912,10 +923,11 @@ public:
        virtual void                                                            setSize(uint64_t size)                  { fSize = size; }
        virtual void                                                            addReference(ObjectFile::Reference* ref) { fReferences.push_back((Reference<A>*)ref); }
        virtual void                                                            sortReferences() { std::sort(fReferences.begin(), fReferences.end(), ReferenceSorter()); }
        virtual void                                                            setSize(uint64_t size)                  { fSize = size; }
        virtual void                                                            addReference(ObjectFile::Reference* ref) { fReferences.push_back((Reference<A>*)ref); }
        virtual void                                                            sortReferences() { std::sort(fReferences.begin(), fReferences.end(), ReferenceSorter()); }
-       virtual void                                                            addLineInfo(const  ObjectFile::LineInfo& info);
+       virtual void                                                            addLineInfo(const  ObjectFile::LineInfo& info) { warning("can't add line info to anonymous symbol %s from %s", this->getDisplayName(), this->getFile()->getPath()); }
        virtual const ObjectFile::ReaderOptions&        getOptions() const                              { return fOwner.fOptions; }
        virtual uint64_t                                                        getObjectAddress() const                { return fAddress; }
        virtual const void*                                                     getSectionRecord() const                { return (const void*)fSection; }
        virtual const ObjectFile::ReaderOptions&        getOptions() const                              { return fOwner.fOptions; }
        virtual uint64_t                                                        getObjectAddress() const                { return fAddress; }
        virtual const void*                                                     getSectionRecord() const                { return (const void*)fSection; }
+       virtual unsigned int                                            getSectionIndex() const                 { return fSectionIndex; }
        BaseAtom*                                                                       redirectTo()                                    { return fRedirect; }
        bool                                                                            isWeakImportStub()                              { return fWeakImportStub; }
        void                                                                            resolveName();
        BaseAtom*                                                                       redirectTo()                                    { return fRedirect; }
        bool                                                                            isWeakImportStub()                              { return fWeakImportStub; }
        void                                                                            resolveName();
@@ -952,6 +964,7 @@ protected:
        ObjectFile::Atom::Scope                                         fScope;
     ObjectFile::Atom::DefinitionKind            fKind;
        ObjectFile::Atom::ContentType                           fType;
        ObjectFile::Atom::Scope                                         fScope;
     ObjectFile::Atom::DefinitionKind            fKind;
        ObjectFile::Atom::ContentType                           fType;
+       unsigned int                                                            fSectionIndex;
 };
 
 template <typename A>
 };
 
 template <typename A>
@@ -959,7 +972,7 @@ AnonymousAtom<A>::AnonymousAtom(Reader<A>& owner, const macho_section<P>* sectio
  : fOwner(owner), fSynthesizedName(NULL), fDisplayName(NULL), fSection(section), fAddress(addr), fSize(size), 
        fSegment(NULL), fDontDeadStrip(true), fWeakImportStub(false), fSymbolTableInclusion(ObjectFile::Atom::kSymbolTableNotIn),
        fScope(ObjectFile::Atom::scopeTranslationUnit), fKind(ObjectFile::Atom::kRegularDefinition), 
  : fOwner(owner), fSynthesizedName(NULL), fDisplayName(NULL), fSection(section), fAddress(addr), fSize(size), 
        fSegment(NULL), fDontDeadStrip(true), fWeakImportStub(false), fSymbolTableInclusion(ObjectFile::Atom::kSymbolTableNotIn),
        fScope(ObjectFile::Atom::scopeTranslationUnit), fKind(ObjectFile::Atom::kRegularDefinition), 
-       fType(ObjectFile::Atom::kUnclassifiedType)
+       fType(ObjectFile::Atom::kUnclassifiedType), fSectionIndex(1 + (section - owner.fSectionsStart))
 {
        fSegment = new Segment<A>(fSection);
        fRedirect = this;
 {
        fSegment = new Segment<A>(fSection);
        fRedirect = this;
@@ -1034,7 +1047,7 @@ AnonymousAtom<A>::AnonymousAtom(Reader<A>& owner, const macho_section<P>* sectio
                case S_CSTRING_LITERALS:
                        {
                                const char* str = (char*)(owner.fHeader) + section->offset() + addr - section->addr();
                case S_CSTRING_LITERALS:
                        {
                                const char* str = (char*)(owner.fHeader) + section->offset() + addr - section->addr();
-                               if ( (strcmp(fSection->sectname(), "__cstring") == 0) && (strcmp(section->segname(), "__TEXT") == 0) ) 
+                               if ( strcmp(fSection->sectname(), "__cstring") == 0 ) 
                                        asprintf((char**)&fSynthesizedName, "cstring=%s", str);
                                else
                                        asprintf((char**)&fSynthesizedName, "cstring%s%s=%s", fSection->segname(), fSection->sectname(), str);
                                        asprintf((char**)&fSynthesizedName, "cstring=%s", str);
                                else
                                        asprintf((char**)&fSynthesizedName, "cstring%s%s=%s", fSection->segname(), fSection->sectname(), str);
@@ -1122,16 +1135,6 @@ AnonymousAtom<A>::AnonymousAtom(Reader<A>& owner, const macho_section<P>* sectio
                case S_LAZY_SYMBOL_POINTERS:
                case S_NON_LAZY_SYMBOL_POINTERS:
                        {
                case S_LAZY_SYMBOL_POINTERS:
                case S_NON_LAZY_SYMBOL_POINTERS:
                        {
-                               // transform i386 __IMPORT/__pointers to __DATA/__nl_symbol_ptr when 
-                               // generating the new compressed LINKEDIT format
-                               if ( (type == S_NON_LAZY_SYMBOL_POINTERS) && fOwner.fOptions.fMakeCompressedDyldInfo && (strcmp(fSection->segname(),"__IMPORT") == 0) ) {
-                                       macho_section<P>* dummySection = new macho_section<P>(*fSection);
-                                       dummySection->set_segname("__DATA");
-                                       dummySection->set_sectname("__nl_symbol_ptr");
-                                       fSection = dummySection;
-                                       fSegment = new Segment<A>(fSection);
-                               }
-                               
                                fDontDeadStrip = false;
                                fScope = ObjectFile::Atom::scopeLinkageUnit;
                                uint32_t index = (fAddress - fSection->addr()) / sizeof(pint_t);
                                fDontDeadStrip = false;
                                fScope = ObjectFile::Atom::scopeLinkageUnit;
                                uint32_t index = (fAddress - fSection->addr()) / sizeof(pint_t);
@@ -1187,6 +1190,16 @@ AnonymousAtom<A>::AnonymousAtom(Reader<A>& owner, const macho_section<P>* sectio
                                        strcat(str, "$non_lazy_ptr");
                                fSynthesizedName = str;
 
                                        strcat(str, "$non_lazy_ptr");
                                fSynthesizedName = str;
 
+                               // transform i386 __IMPORT/__pointers to __DATA/__nl_symbol_ptr when 
+                               // generating the new compressed LINKEDIT format
+                               if ( fOwner.fOptions.fMakeCompressedDyldInfo && (strcmp(fSection->segname(),"__IMPORT") == 0) ) {
+                                       macho_section<P>* dummySection = new macho_section<P>(*fSection);
+                                       dummySection->set_segname("__DATA");
+                                       dummySection->set_sectname("__nl_symbol_ptr");
+                                       fSection = dummySection;
+                                       fSegment = new Segment<A>(fSection);
+                               }
+                               
                                if ( type == S_NON_LAZY_SYMBOL_POINTERS )
                                        fKind = ObjectFile::Atom::kWeakDefinition;
 
                                if ( type == S_NON_LAZY_SYMBOL_POINTERS )
                                        fKind = ObjectFile::Atom::kWeakDefinition;
 
@@ -1213,13 +1226,6 @@ AnonymousAtom<A>::AnonymousAtom(Reader<A>& owner, const macho_section<P>* sectio
 template <> bool AnonymousAtom<x86_64>::cstringsHaveLabels() { return true; }
 template <typename A> bool AnonymousAtom<A>::cstringsHaveLabels() { return false; }
 
 template <> bool AnonymousAtom<x86_64>::cstringsHaveLabels() { return true; }
 template <typename A> bool AnonymousAtom<A>::cstringsHaveLabels() { return false; }
 
-template <typename A>
-void AnonymousAtom<A>::addLineInfo(const ObjectFile::LineInfo& info) 
-{ 
-       // <rdar://problem/6545406> don't warn if line table has entries for stubs
-       if ( (fSection->flags() & SECTION_TYPE) != S_SYMBOL_STUBS )
-               warning("can't add line info to anonymous symbol %s from %s", this->getDisplayName(), this->getFile()->getPath()); 
-}
 
 template <typename A>
 void AnonymousAtom<A>::resolveName()
 
 template <typename A>
 void AnonymousAtom<A>::resolveName()
@@ -1324,7 +1330,7 @@ ObjectFile::Atom::Scope AnonymousAtom<A>::getScope() const
 template <typename A>
 bool AnonymousAtom<A>::isZeroFill() const
 {
 template <typename A>
 bool AnonymousAtom<A>::isZeroFill() const
 {
-       return ( (fSection->flags() & SECTION_TYPE) == S_ZEROFILL );
+       return ( ((fSection->flags() & SECTION_TYPE) == S_ZEROFILL) && fOwner.fOptions.fOptimizeZeroFill );
 }
 
 
 }
 
 
@@ -1434,6 +1440,7 @@ public:
        virtual uint64_t                                                        getObjectAddress() const                { return fSymbol->n_value(); }
        virtual void                                                            setSectionOffset(uint64_t offset) { /* don't let fSectionOffset be altered*/ }
        virtual const void*                                                     getSectionRecord() const                { return NULL; }
        virtual uint64_t                                                        getObjectAddress() const                { return fSymbol->n_value(); }
        virtual void                                                            setSectionOffset(uint64_t offset) { /* don't let fSectionOffset be altered*/ }
        virtual const void*                                                     getSectionRecord() const                { return NULL; }
+       virtual unsigned int                                            getSectionIndex() const                 { return 0; }
 
 protected:
        typedef typename A::P                                   P;
 
 protected:
        typedef typename A::P                                   P;
@@ -1472,6 +1479,110 @@ AbsoluteAtom<A>::AbsoluteAtom(Reader<A>& owner, const macho_nlist<P>* symbol)
 }
 
 
 }
 
 
+//
+// An SectionBoundaryAtom represent the start or end of a section
+//
+template <typename A>
+class SectionBoundaryAtom : public BaseAtom
+{
+public:
+       virtual ObjectFile::Reader*                                     getFile() const                                 { return &fOwner; }
+       virtual bool                                                            getTranslationUnitSource(const char** dir, const char** name) const
+                                                                                                                                                               { return fOwner.getTranslationUnitSource(dir, name); }
+       virtual const char*                                                     getName() const                                 { return fSymbolName; }
+       virtual const char*                                                     getDisplayName() const                  { return fDisplayName; }
+       virtual ObjectFile::Atom::Scope                         getScope() const                                { return ObjectFile::Atom::scopeLinkageUnit; }
+       virtual ObjectFile::Atom::DefinitionKind        getDefinitionKind() const               { return ObjectFile::Atom::kWeakDefinition; }
+       virtual ObjectFile::Atom::ContentType           getContentType() const                  { return fStart ? ObjectFile::Atom::kSectionStart : ObjectFile::Atom::kSectionEnd; }
+       virtual bool                                                            isZeroFill() const                              { return false; }
+       virtual bool                                                            isThumb() const                                 { return false; }
+       virtual SymbolTableInclusion                            getSymbolTableInclusion() const { return ObjectFile::Atom::kSymbolTableNotIn; }
+       virtual bool                                                            dontDeadStrip() const                   { return false; }
+       virtual uint64_t                                                        getSize() const                                 { return 0; }
+       virtual std::vector<ObjectFile::Reference*>&  getReferences() const                     { return fgNoReferences; }
+       virtual bool                                                            mustRemainInSection() const             { return true; }
+       virtual const char*                                                     getSectionName() const                  { return fSectionName; } 
+       virtual ObjectFile::Segment&                            getSegment() const                              { return *fSegment; }
+       virtual ObjectFile::Atom&                                       getFollowOnAtom() const                 { return *(ObjectFile::Atom*)NULL; }
+       virtual std::vector<ObjectFile::LineInfo>*      getLineInfo() const                             { return NULL; }
+       virtual ObjectFile::Alignment                           getAlignment() const                    { return ObjectFile::Alignment(0); }
+       virtual void                                                            copyRawContent(uint8_t buffer[]) const  { }
+       virtual void                                                            setScope(ObjectFile::Atom::Scope newScope)              { }
+       virtual void                                                            setSize(uint64_t size)                  { }
+       virtual void                                                            addReference(ObjectFile::Reference* ref) { throw "ld: can't add references"; }
+       virtual void                                                            sortReferences()                                { }
+       virtual void                                                            addLineInfo(const  ObjectFile::LineInfo& info)  { throw "ld: can't add line info to tentative definition"; }
+       virtual const ObjectFile::ReaderOptions&        getOptions() const                              { return fOwner.fOptions; }
+       virtual uint64_t                                                        getObjectAddress() const                { return 0; }
+       virtual const void*                                                     getSectionRecord() const                { return NULL; }
+       virtual unsigned int                                            getSectionIndex() const                 { return 0; }
+
+protected:
+       typedef typename A::P                                   P;
+       typedef typename A::P::E                                E;
+       typedef typename A::P::uint_t                   pint_t;
+       typedef typename A::ReferenceKinds              Kinds;
+       friend class Reader<A>;
+
+
+       class Segment : public ObjectFile::Segment
+       {
+       public:
+                                                                       Segment(const char* name, bool r, bool w, bool x): 
+                                                                               fName(name), fReadable(r), fWritable(w), fExecutable(x) {}
+                                                                               
+               virtual const char*                     getName() const                                         { return fName; }
+               virtual bool                            isContentReadable() const                       { return fReadable; }
+               virtual bool                            isContentWritable() const                       { return fWritable; }
+               virtual bool                            isContentExecutable() const                     { return fExecutable; }
+       private:
+               const char*                                     fName;
+               bool                                            fReadable;
+               bool                                            fWritable;
+               bool                                            fExecutable;
+       };
+
+                                                                                       SectionBoundaryAtom(Reader<A>&, bool start, const char* symbolName, const char* segSectName);
+       virtual                                                                 ~SectionBoundaryAtom() {}
+
+       Reader<A>&                                                                      fOwner;
+       class Segment*                                                          fSegment;
+       const char*                                                                     fSymbolName;
+       const char*                                                                     fSectionName;
+       const char*                                                                     fDisplayName;
+       bool                                                                            fStart;
+       static std::vector<ObjectFile::Reference*>      fgNoReferences;
+};
+
+template <typename A>
+std::vector<ObjectFile::Reference*> SectionBoundaryAtom<A>::fgNoReferences;
+
+// examples:
+//                     section$start$__DATA$__my
+//                     section$end$__DATA$__my
+template <typename A>
+SectionBoundaryAtom<A>::SectionBoundaryAtom(Reader<A>& owner, bool start, const char* symbolName, const char* segSectName)
+ : fOwner(owner), fSymbolName(symbolName), fSectionName(NULL), fStart(start)
+{
+       const char* segSectDividor = strrchr(segSectName, '$');
+       if ( segSectDividor == NULL )
+               throwf("malformed section reference name: %s", symbolName);
+       fSectionName = segSectDividor + 1;
+       int segNameLen = segSectDividor - segSectName;
+       if ( segNameLen > 16 )
+               throwf("malformed section reference name: %s", symbolName);
+       char segName[18];
+       strlcpy(segName, segSectName, segNameLen+1);
+       if ( strcmp(segName, "__TEXT") == 0 )
+               fSegment = new Segment("__TEXT", true, false, true);
+       else if ( strcmp(segName, "__DATA") == 0 ) 
+               fSegment = new Segment("__DATA", true, true, false);
+       else 
+               fSegment = new Segment(strdup(segName), true, true, false);
+
+       asprintf((char**)&fDisplayName, "%s of section '%s' in segment '%s'", (start ? "start" : "end"), fSectionName, segName);
+}
+
 
 
 ///
 
 
 ///
@@ -1499,13 +1610,11 @@ public:
 private:
        const void*                     mappedAddress(pint_t addr, pint_t* relocTarget=NULL);
        pint_t                          relocated(uint32_t sectOffset, uint32_t relocsOffset, uint32_t relocsCount);
 private:
        const void*                     mappedAddress(pint_t addr, pint_t* relocTarget=NULL);
        pint_t                          relocated(uint32_t sectOffset, uint32_t relocsOffset, uint32_t relocsCount);
-       void                            buildRelocatedMap(const macho_section<P>* sect, std::map<uint32_t,uint64_t>& map);
        
        Reader<A>&                              fReader;
        const uint8_t*                  fMappingStart;
        const macho_section<P>* fSectionsStart;
        const macho_section<P>* fSectionsEnd;
        
        Reader<A>&                              fReader;
        const uint8_t*                  fMappingStart;
        const macho_section<P>* fSectionsStart;
        const macho_section<P>* fSectionsEnd;
-       std::map<uint32_t,uint64_t> fEHFrameOffsetToTargetMap;
 };
 
 
 };
 
 
@@ -1525,43 +1634,26 @@ const void* ObjectFileAddressSpace<A>::mappedAddress(pint_t addr, pint_t* relocT
                fMappingStart = (uint8_t*)fReader.fHeader;
                fSectionsStart = (macho_section<P>*)((char*)fReader.fSegment + sizeof(macho_segment_command<P>));
                fSectionsEnd = &fSectionsStart[fReader.fSegment->nsects()];
                fMappingStart = (uint8_t*)fReader.fHeader;
                fSectionsStart = (macho_section<P>*)((char*)fReader.fSegment + sizeof(macho_segment_command<P>));
                fSectionsEnd = &fSectionsStart[fReader.fSegment->nsects()];
-               // find __eh_frame section and build map of relocations for performance
-               buildRelocatedMap(fReader.fehFrameSection, fEHFrameOffsetToTargetMap);
-       }
-       // special case lookups in __eh_frame section to be fast
-       const macho_section<P>* ehSect = fReader.fehFrameSection;
-       if ( (ehSect->addr() <= addr) && (addr < (ehSect->addr()+ehSect->size())) ) {
-               pint_t offsetOfAddrInSection = addr - ehSect->addr();
-               if ( relocTarget != NULL ) {
-                       std::map<uint32_t,uint64_t>::iterator pos = fEHFrameOffsetToTargetMap.find(offsetOfAddrInSection);
-                       if ( pos != fEHFrameOffsetToTargetMap.end() )
-                               *relocTarget = pos->second;
-                       else
-                               *relocTarget = 0;
-               }
-               return fMappingStart + ehSect->offset() + offsetOfAddrInSection;
        }
        }
-       else {
-               for (const macho_section<P>* sect=fSectionsStart; sect < fSectionsEnd; ++sect) {
-                       if ( (sect->addr() <= addr) && (addr < (sect->addr()+sect->size())) ) {
-                               pint_t offsetOfAddrInSection = addr - sect->addr();
-                               if ( (sect->flags() & SECTION_TYPE) == S_NON_LAZY_SYMBOL_POINTERS ) {
-                                       const uint32_t indirectTableOffset = sect->reserved1();
-                                       const uint32_t sectionIndex = offsetOfAddrInSection/sizeof(pint_t);
-                                       const uint32_t symbolIndex = A::P::E::get32(fReader.fIndirectTable[indirectTableOffset+sectionIndex]);
-                                       // return pointer to symbol name which this non-lazy-pointer will point to
-                                       if ( relocTarget != NULL )
-                                               *relocTarget = (uintptr_t)&fReader.fStrings[fReader.fSymbols[symbolIndex].n_strx()];
-                               }
-                               else {
-                                       if ( relocTarget != NULL )
-                                               *relocTarget = relocated(offsetOfAddrInSection, sect->reloff(), sect->nreloc());
-                               }
-                               return fMappingStart + sect->offset() + offsetOfAddrInSection;
+       for (const macho_section<P>* sect=fSectionsStart; sect < fSectionsEnd; ++sect) {
+               if ( (sect->addr() <= addr) && (addr < (sect->addr()+sect->size())) ) {
+                       pint_t offsetOfAddrInSection = addr - sect->addr();
+                       if ( (sect->flags() & SECTION_TYPE) == S_NON_LAZY_SYMBOL_POINTERS ) {
+                               const uint32_t indirectTableOffset = sect->reserved1();
+                               const uint32_t sectionIndex = offsetOfAddrInSection/sizeof(pint_t);
+                               const uint32_t symbolIndex = A::P::E::get32(fReader.fIndirectTable[indirectTableOffset+sectionIndex]);
+                               // return pointer to symbol name which this non-lazy-pointer will point to
+                               if ( relocTarget != NULL )
+                                       *relocTarget = (uintptr_t)&fReader.fStrings[fReader.fSymbols[symbolIndex].n_strx()];
+                       }
+                       else {
+                               if ( relocTarget != NULL )
+                                       *relocTarget = relocated(offsetOfAddrInSection, sect->reloff(), sect->nreloc());
                        }
                        }
+                       return fMappingStart + sect->offset() + offsetOfAddrInSection;
                }
                }
-               throwf("ObjectFileAddressSpace::mappedAddress(0x%0lX) not in any section", (long)addr);
        }
        }
+       throwf("ObjectFileAddressSpace::mappedAddress(0x%0lX) not in any section", (long)addr);
 }
 
 
 }
 
 
@@ -1664,6 +1756,7 @@ private:
        friend class AnonymousAtom<A>;
        friend class TentativeAtom<A>;
        friend class AbsoluteAtom<A>;
        friend class AnonymousAtom<A>;
        friend class TentativeAtom<A>;
        friend class AbsoluteAtom<A>;
+       friend class SectionBoundaryAtom<A>;
        friend class SymbolAtom<A>;
        typedef std::map<pint_t, BaseAtom*>                     AddrToAtomMap;
 
        friend class SymbolAtom<A>;
        typedef std::map<pint_t, BaseAtom*>                     AddrToAtomMap;
 
@@ -1676,6 +1769,7 @@ private:
        static bool                                                                     skip_form(const uint8_t ** offset, const uint8_t * end, uint64_t form, uint8_t addr_size, bool dwarf64);
        static const char*                                                      assureFullPath(const char* path);
        AtomAndOffset                                                           findAtomAndOffset(pint_t addr);
        static bool                                                                     skip_form(const uint8_t ** offset, const uint8_t * end, uint64_t form, uint8_t addr_size, bool dwarf64);
        static const char*                                                      assureFullPath(const char* path);
        AtomAndOffset                                                           findAtomAndOffset(pint_t addr);
+       AtomAndOffset                                                           findAtomAndOffsetForSection(pint_t addr, unsigned int sectionIndex);
        AtomAndOffset                                                           findAtomAndOffset(pint_t baseAddr, pint_t realAddr);
        Reference<A>*                                                           makeReference(Kinds kind, pint_t atAddr, pint_t toAddr);
        Reference<A>*                                                           makeReference(Kinds kind, pint_t atAddr, pint_t fromAddr, pint_t toAddr);
        AtomAndOffset                                                           findAtomAndOffset(pint_t baseAddr, pint_t realAddr);
        Reference<A>*                                                           makeReference(Kinds kind, pint_t atAddr, pint_t toAddr);
        Reference<A>*                                                           makeReference(Kinds kind, pint_t atAddr, pint_t fromAddr, pint_t toAddr);
@@ -1822,12 +1916,8 @@ Reader<A>::Reader(const uint8_t* fileContent, const char* path, time_t modTime,
        for (const macho_section<P>* sect=fSectionsStart; sect < fSectionsEnd; ++sect) {
                if ( (strcmp(sect->sectname(), "__eh_frame") == 0) && (strcmp(sect->segname(), "__TEXT") == 0) ) {
                        fehFrameSection = sect;
        for (const macho_section<P>* sect=fSectionsStart; sect < fSectionsEnd; ++sect) {
                if ( (strcmp(sect->sectname(), "__eh_frame") == 0) && (strcmp(sect->segname(), "__TEXT") == 0) ) {
                        fehFrameSection = sect;
-                       const char* msg = libunwind::CFI_Parser<ObjectFileAddressSpace<A> >::getCFIs(fObjectAddressSpace, sect->addr(), 
-                                                                                                                                                                               sect->size(), fFDEInfos, fCIEInfos);
-                       if ( msg != NULL ) {
-                               throwf("malformed __eh_frame section: %s", msg);
-                       }
-                       else {
+                       if ( libunwind::CFI_Parser<ObjectFileAddressSpace<A> >::getCFIs(fObjectAddressSpace, sect->addr(), sect->size(), 
+                                                                                                                                                               fCIEInfos, fFDEInfos) ) {
                                //fprintf(stderr, "%lu CIEs, %lu FDEs\n", fCIEInfos.size(), fFDEInfos.size());
                                // add anonymous atoms for each CIE
                                for (typename std::vector<CIE_Atom_Info>::const_iterator it = fCIEInfos.begin(); it != fCIEInfos.end(); ++it) {
                                //fprintf(stderr, "%lu CIEs, %lu FDEs\n", fCIEInfos.size(), fFDEInfos.size());
                                // add anonymous atoms for each CIE
                                for (typename std::vector<CIE_Atom_Info>::const_iterator it = fCIEInfos.begin(); it != fCIEInfos.end(); ++it) {
@@ -1849,6 +1939,9 @@ Reader<A>::Reader(const uint8_t* fileContent, const char* path, time_t modTime,
                                        }
                                }
                        }
                                        }
                                }
                        }
+                       else {
+                               throw "malformed __eh_frame section";
+                       }
                }
        }
 
                }
        }
 
@@ -1947,6 +2040,13 @@ Reader<A>::Reader(const uint8_t* fileContent, const char* path, time_t modTime,
                        else if ( (type == N_UNDF) && (sym.n_value() != 0) ) {
                                fAtoms.push_back(new TentativeAtom<A>(*this, &sym));
                        }
                        else if ( (type == N_UNDF) && (sym.n_value() != 0) ) {
                                fAtoms.push_back(new TentativeAtom<A>(*this, &sym));
                        }
+                       else if ( (type == N_UNDF) && (sym.n_value() == 0) ) {
+                               const char* symName = &fStrings[sym.n_strx()];
+                               if ( strncmp(symName, "section$start$", 14) == 0) 
+                                       fAtoms.push_back(new SectionBoundaryAtom<A>(*this, true, symName, &symName[14]));
+                               else if ( strncmp(symName, "section$end$", 12) == 0) 
+                                       fAtoms.push_back(new SectionBoundaryAtom<A>(*this, false, symName, &symName[12]));
+                       }
                        else if ( type == N_ABS ) {
                                const char* symName = &fStrings[sym.n_strx()];
                                if ( strncmp(symName, ".objc_class_name_", 17) == 0 ) {
                        else if ( type == N_ABS ) {
                                const char* symName = &fStrings[sym.n_strx()];
                                if ( strncmp(symName, ".objc_class_name_", 17) == 0 ) {
@@ -2089,8 +2189,9 @@ Reader<A>::Reader(const uint8_t* fileContent, const char* path, time_t modTime,
                        for(pint_t sectOffset=0; sectOffset < sect->size(); sectOffset += stringLen) {
                                stringAddr = sect->addr() + sectOffset;
                                stringLen  = strlen((char*)(fHeader) + sect->offset() + sectOffset) + 1;
                        for(pint_t sectOffset=0; sectOffset < sect->size(); sectOffset += stringLen) {
                                stringAddr = sect->addr() + sectOffset;
                                stringLen  = strlen((char*)(fHeader) + sect->offset() + sectOffset) + 1;
-                               // add if not already an atom at that address
-                               if ( fAddrToAtom.find(stringAddr) == fAddrToAtom.end() ) {
+                               // add if not already a non-zero length atom at that address
+                               typename AddrToAtomMap::iterator pos = fAddrToAtom.find(stringAddr);
+                               if ( (pos == fAddrToAtom.end()) || (pos->second->getSize() == 0) ) {
                                        BaseAtom* newAtom = new AnonymousAtom<A>(*this, sect, stringAddr, stringLen);
                                        if ( stringLen == 1 ) {
                                                // because of padding it may look like there are lots of empty strings, keep track of all
                                        BaseAtom* newAtom = new AnonymousAtom<A>(*this, sect, stringAddr, stringLen);
                                        if ( stringLen == 1 ) {
                                                // because of padding it may look like there are lots of empty strings, keep track of all
@@ -2724,44 +2825,6 @@ ObjectFile::Atom* Reader<A>::getFunctionAtomFromLSDAAddress(pint_t addr)
 }
 
 
 }
 
 
-template <>
-void ObjectFileAddressSpace<x86_64>::buildRelocatedMap(const macho_section<P>* sect, std::map<uint32_t,uint64_t>& map)
-{      
-       // mach-o x86_64 is different, the content of a section with a relocation is the addend
-       const macho_relocation_info<P>* relocs = (macho_relocation_info<P>*)((char*)(fReader.fHeader) + sect->reloff());
-       const macho_relocation_info<P>* relocsEnd = &relocs[sect->nreloc()];
-       for (const macho_relocation_info<P>* reloc = relocs; reloc < relocsEnd; ++reloc) {
-               std::map<uint32_t,uint64_t>::iterator pos;
-               switch ( reloc->r_type() ) {
-                       case X86_64_RELOC_UNSIGNED:
-                               pos = map.find(reloc->r_address());
-                               if ( pos != map.end() )
-                                       pos->second += fReader.fSymbols[reloc->r_symbolnum()].n_value();
-                               else
-                                       map[reloc->r_address()] = fReader.fSymbols[reloc->r_symbolnum()].n_value();
-                               break;
-                       case X86_64_RELOC_SUBTRACTOR:
-                               map[reloc->r_address()] = -fReader.fSymbols[reloc->r_symbolnum()].n_value();
-                               break;
-                       case X86_64_RELOC_GOT:
-                               // there is no good address to return here.
-                               // GOT slots are synthsized by the linker
-                               // this is used for the reference to the personality function in CIEs
-                               map[reloc->r_address()] = 0;
-                               break;
-                       default:
-                               fprintf(stderr, "ObjectFileAddressSpace::buildRelocatedMap() unexpected relocation at r_address=0x%08X\n", reloc->r_address());
-                               break;
-               }
-       }
-}
-
-template <typename A>
-void ObjectFileAddressSpace<A>::buildRelocatedMap(const macho_section<P>* sect, std::map<uint32_t,uint64_t>& map)
-{
-       // in all architectures except x86_64, the section contents are already fixed up to point
-       // to content in the same object file.
-}
 
 template <>
 uint64_t ObjectFileAddressSpace<x86_64>::relocated(uint32_t sectOffset, uint32_t relocsOffset, uint32_t relocsCount)
 
 template <>
 uint64_t ObjectFileAddressSpace<x86_64>::relocated(uint32_t sectOffset, uint32_t relocsOffset, uint32_t relocsCount)
@@ -3037,15 +3100,14 @@ uint32_t SymbolAtom<x86>::getCompactUnwindEncoding(uint64_t ehAtomAddress)
 {
        pint_t lsda;
        pint_t personality;
 {
        pint_t lsda;
        pint_t personality;
-       char warningBuffer[1024];
        uint32_t result = libunwind::DwarfInstructions<class ObjectFileAddressSpace<x86>, libunwind::Registers_x86>::createCompactEncodingFromFDE(
        uint32_t result = libunwind::DwarfInstructions<class ObjectFileAddressSpace<x86>, libunwind::Registers_x86>::createCompactEncodingFromFDE(
-                                                                                       fOwner.fObjectAddressSpace, ehAtomAddress, &lsda, &personality, warningBuffer);
-       if ( (result & UNWIND_X86_MODE_MASK) == UNWIND_X86_MODE_DWARF ) {
+                                                                                       fOwner.fObjectAddressSpace, ehAtomAddress, &lsda, &personality);
+       if ( (result & UNWIND_X86_CASE_MASK) == UNWIND_X86_UNWIND_REQUIRES_DWARF ) {
                //if ( fOwner.fOptions.fForDyld )
                //      throwf("can't make compact unwind encoding from dwarf for %s",  this->getDisplayName());
                //else
                        if ( fOwner.fOptions.fWarnCompactUnwind )
                //if ( fOwner.fOptions.fForDyld )
                //      throwf("can't make compact unwind encoding from dwarf for %s",  this->getDisplayName());
                //else
                        if ( fOwner.fOptions.fWarnCompactUnwind )
-                               warning("can't make compact unwind encoding from dwarf for %s in %s because %s", this->getDisplayName(), fOwner.getPath(), warningBuffer);
+                               warning("can't make compact unwind encoding from dwarf for %s in %s", this->getDisplayName(), fOwner.getPath());
        }
        return result;
 }
        }
        return result;
 }
@@ -3055,15 +3117,14 @@ uint32_t SymbolAtom<x86_64>::getCompactUnwindEncoding(uint64_t ehAtomAddress)
 {
        pint_t lsda;
        pint_t personality;
 {
        pint_t lsda;
        pint_t personality;
-       char warningBuffer[1024];
        uint32_t result = libunwind::DwarfInstructions<class ObjectFileAddressSpace<x86_64>, libunwind::Registers_x86_64>::createCompactEncodingFromFDE(
        uint32_t result = libunwind::DwarfInstructions<class ObjectFileAddressSpace<x86_64>, libunwind::Registers_x86_64>::createCompactEncodingFromFDE(
-                                                                                       fOwner.fObjectAddressSpace, ehAtomAddress, &lsda, &personality, warningBuffer);
-       if ( (result & UNWIND_X86_64_MODE_MASK) == UNWIND_X86_64_MODE_DWARF ) {
+                                                                                       fOwner.fObjectAddressSpace, ehAtomAddress, &lsda, &personality);
+       if ( (result & UNWIND_X86_64_CASE_MASK) == UNWIND_X86_64_UNWIND_REQUIRES_DWARF ) {
                //if ( fOwner.fOptions.fForDyld )
                //      throwf("can't make compact unwind encoding from dwarf for %s",  this->getDisplayName());
                //else
                        if ( fOwner.fOptions.fWarnCompactUnwind )
                //if ( fOwner.fOptions.fForDyld )
                //      throwf("can't make compact unwind encoding from dwarf for %s",  this->getDisplayName());
                //else
                        if ( fOwner.fOptions.fWarnCompactUnwind )
-                               warning("can't make compact unwind encoding from dwarf for %s in %s because %s", this->getDisplayName(), fOwner.getPath(), warningBuffer);
+                               warning("can't make compact unwind encoding from dwarf for %s in %s", this->getDisplayName(), fOwner.getPath());
        }
        return result;
 }
        }
        return result;
 }
@@ -3121,14 +3182,12 @@ uint32_t AnonymousAtom<x86>::getCompactUnwindEncoding(uint64_t ehAtomAddress)
 {
        pint_t lsda;
        pint_t personality;
 {
        pint_t lsda;
        pint_t personality;
-       char warningBuffer[1024];
        uint32_t result = libunwind::DwarfInstructions<class ObjectFileAddressSpace<x86>, libunwind::Registers_x86>::createCompactEncodingFromFDE(
        uint32_t result = libunwind::DwarfInstructions<class ObjectFileAddressSpace<x86>, libunwind::Registers_x86>::createCompactEncodingFromFDE(
-                                                                                       fOwner.fObjectAddressSpace, ehAtomAddress, &lsda, &personality, warningBuffer);
-       if ( (result & UNWIND_X86_MODE_MASK) == UNWIND_X86_MODE_DWARF ) {
+                                                                                       fOwner.fObjectAddressSpace, ehAtomAddress, &lsda, &personality);
+       if ( (result & UNWIND_X86_CASE_MASK) == UNWIND_X86_UNWIND_REQUIRES_DWARF ) {
                //if ( fOwner.fOptions.fForDyld )
                //      throwf("can't make compact unwind encoding from dwarf for %s",  this->getDisplayName());
                //else
                //if ( fOwner.fOptions.fForDyld )
                //      throwf("can't make compact unwind encoding from dwarf for %s",  this->getDisplayName());
                //else
-               if ( fOwner.fOptions.fWarnCompactUnwind )
                        warning("can't make compact unwind encoding from dwarf for %s in %s", this->getDisplayName(), fOwner.getPath());
        }
        return result;
                        warning("can't make compact unwind encoding from dwarf for %s in %s", this->getDisplayName(), fOwner.getPath());
        }
        return result;
@@ -3139,14 +3198,12 @@ uint32_t AnonymousAtom<x86_64>::getCompactUnwindEncoding(uint64_t ehAtomAddress)
 {
        pint_t lsda;
        pint_t personality;
 {
        pint_t lsda;
        pint_t personality;
-       char warningBuffer[1024];
        uint32_t result = libunwind::DwarfInstructions<class ObjectFileAddressSpace<x86_64>, libunwind::Registers_x86_64>::createCompactEncodingFromFDE(
        uint32_t result = libunwind::DwarfInstructions<class ObjectFileAddressSpace<x86_64>, libunwind::Registers_x86_64>::createCompactEncodingFromFDE(
-                                                                                               fOwner.fObjectAddressSpace, ehAtomAddress, &lsda, &personality, warningBuffer);
-       if ( (result & UNWIND_X86_64_MODE_MASK) == UNWIND_X86_64_MODE_DWARF ) {
+                                                                                       fOwner.fObjectAddressSpace, ehAtomAddress, &lsda, &personality);
+       if ( (result & UNWIND_X86_64_CASE_MASK) == UNWIND_X86_64_UNWIND_REQUIRES_DWARF ) {
                //if ( fOwner.fOptions.fForDyld )
                //      throwf("can't make compact unwind encoding from dwarf for %s",  this->getDisplayName());
                //else
                //if ( fOwner.fOptions.fForDyld )
                //      throwf("can't make compact unwind encoding from dwarf for %s",  this->getDisplayName());
                //else
-               if ( fOwner.fOptions.fWarnCompactUnwind )
                        warning("can't make compact unwind encoding from dwarf for %s in %s", this->getDisplayName(), fOwner.getPath());
        }
        return result;
                        warning("can't make compact unwind encoding from dwarf for %s in %s", this->getDisplayName(), fOwner.getPath());
        }
        return result;
@@ -3464,8 +3521,11 @@ Reference<x86_64>* Reader<x86_64>::makeReferenceToSymbol(Kinds kind, pint_t atAd
        // x86_64 uses external relocations everywhere, so external relocations do not imply by-name references
        // instead check scope of target
        const char* symbolName = &fStrings[toSymbol->n_strx()];
        // x86_64 uses external relocations everywhere, so external relocations do not imply by-name references
        // instead check scope of target
        const char* symbolName = &fStrings[toSymbol->n_strx()];
-       if ( ((toSymbol->n_type() & N_TYPE) == N_SECT) && (((toSymbol->n_type() & N_EXT) == 0) || (symbolName[0] == 'L')) ) 
-               return new Reference<x86_64>(kind, findAtomAndOffset(atAddr), findAtomAndOffset(toSymbol->n_value(), toSymbol->n_value()+toOffset));
+       if ( ((toSymbol->n_type() & N_TYPE) == N_SECT) && (((toSymbol->n_type() & N_EXT) == 0) || (symbolName[0] == 'L')) ) {
+               AtomAndOffset targetAO = findAtomAndOffsetForSection(toSymbol->n_value(), toSymbol->n_sect());
+               targetAO.offset = toOffset;
+               return new Reference<x86_64>(kind, findAtomAndOffset(atAddr), targetAO);
+       }
        else
                return new Reference<x86_64>(kind, findAtomAndOffset(atAddr), symbolName, toOffset);
 }
        else
                return new Reference<x86_64>(kind, findAtomAndOffset(atAddr), symbolName, toOffset);
 }
@@ -3492,6 +3552,29 @@ BaseAtom* Reader<x86_64>::makeReferenceToEH(const char* ehName, pint_t ehAtomAdd
        return NULL;
 }
 
        return NULL;
 }
 
+template <typename A>
+AtomAndOffset Reader<A>::findAtomAndOffsetForSection(pint_t addr, unsigned int expectedSectionIndex)
+{
+       AtomAndOffset ao = findAtomAndOffset(addr);
+       if ( ao.atom != NULL ) {
+               if ( ((BaseAtom*)(ao.atom))->getSectionIndex() == expectedSectionIndex )
+                       return ao;
+       }
+       // The atom found is not in the section expected.
+       // This probably means there was a label at the end of the section.
+       // Do a slow sequential lookup
+       for (std::vector<BaseAtom*>::iterator it=fAtoms.begin(); it != fAtoms.end(); ++it) {
+               BaseAtom* atom = *it;
+               if ( atom->getSectionIndex() == expectedSectionIndex ) {
+                       pint_t objAddr = atom->getObjectAddress();
+                       if ( (objAddr == addr) || ((objAddr < addr) && (objAddr+atom->getSize() > addr)) ) {
+                               return AtomAndOffset(atom, addr-atom->getObjectAddress());
+                       }
+               }
+       }
+       // no atom found
+       return AtomAndOffset(NULL);
+}
 
 template <typename A>
 AtomAndOffset Reader<A>::findAtomAndOffset(pint_t addr)
 
 template <typename A>
 AtomAndOffset Reader<A>::findAtomAndOffset(pint_t addr)
@@ -3528,10 +3611,9 @@ AtomAndOffset Reader<A>::findAtomAndOffset(pint_t baseAddr, pint_t realAddr)
                return result;
        }
        // getting here means we have a scattered relocation to an address without a label
                return result;
        }
        // getting here means we have a scattered relocation to an address without a label
-       // so, find the atom that contains the baseAddr, and offset from that to the readAddr
-       AtomAndOffset result = findAtomAndOffset(baseAddr);
-       result.offset += (realAddr-baseAddr);
-       return result;
+       // we should never get here...
+       // one case we do get here is because sometimes the compiler generates non-lazy pointers in the __data section
+       return findAtomAndOffset(realAddr);
 }
 
 
 }
 
 
@@ -4123,7 +4205,7 @@ bool Reader<A>::addRelocReference_powerpc(const macho_section<typename A::P>* se
                                                        makeByNameReference(A::kPointer, srcAddr, targetName, pointerValue);
                                        }
                                        else {
                                                        makeByNameReference(A::kPointer, srcAddr, targetName, pointerValue);
                                        }
                                        else {
-                                               makeReference(A::kPointer, srcAddr, pointerValue);
+                                               new Reference<A>(A::kPointer, findAtomAndOffset(srcAddr), findAtomAndOffsetForSection(pointerValue, reloc->r_symbolnum()));
                                        }
                                }
                                break;
                                        }
                                }
                                break;
@@ -4411,9 +4493,8 @@ bool Reader<x86>::addRelocReference(const macho_section<x86::P>* sect, const mac
                                                        makeByNameReference(kind, srcAddr, targetName, pointerValue);
                                        }
                                        else {
                                                        makeByNameReference(kind, srcAddr, targetName, pointerValue);
                                        }
                                        else {
-                                               // if this is a branch to a stub, we need to see if the stub is for a weak imported symbol
-                                               ObjectFile::Atom* atom = findAtomAndOffset(pointerValue).atom;
-                                               const char* targetName = atom->getName();
+                                               AtomAndOffset targetAO = findAtomAndOffsetForSection(pointerValue, reloc->r_symbolnum());
+                                               const char* targetName = targetAO.atom->getName();
                                                if ( (targetName != NULL) && (strncmp(targetName, "___dtrace_probe$", 16) == 0) ) {
                                                        makeByNameReference(x86::kDtraceProbeSite, srcAddr, targetName, 0);
                                                        addDtraceExtraInfos(srcAddr, &targetName[16]);
                                                if ( (targetName != NULL) && (strncmp(targetName, "___dtrace_probe$", 16) == 0) ) {
                                                        makeByNameReference(x86::kDtraceProbeSite, srcAddr, targetName, 0);
                                                        addDtraceExtraInfos(srcAddr, &targetName[16]);
@@ -4422,11 +4503,12 @@ bool Reader<x86>::addRelocReference(const macho_section<x86::P>* sect, const mac
                                                        makeByNameReference(x86::kDtraceIsEnabledSite, srcAddr, targetName, 0);
                                                        addDtraceExtraInfos(srcAddr, &targetName[20]);
                                                }
                                                        makeByNameReference(x86::kDtraceIsEnabledSite, srcAddr, targetName, 0);
                                                        addDtraceExtraInfos(srcAddr, &targetName[20]);
                                                }
-                                               else if ( reloc->r_pcrel() && (atom->getSymbolTableInclusion() == ObjectFile::Atom::kSymbolTableNotIn)
-                                                       && ((AnonymousAtom<x86>*)atom)->isWeakImportStub() )
-                                                       makeReference(x86::kPCRel32WeakImport, srcAddr, pointerValue);
+                                               // if this is a reference to a stub, we need to see if the stub is for a weak imported symbol
+                                               else if ( reloc->r_pcrel() && (targetAO.atom->getSymbolTableInclusion() == ObjectFile::Atom::kSymbolTableNotIn)
+                                                       && ((AnonymousAtom<x86>*)targetAO.atom)->isWeakImportStub() )
+                                                       new Reference<x86>(x86::kPCRel32WeakImport, findAtomAndOffset(srcAddr), targetAO);
                                                else if ( reloc->r_symbolnum() != R_ABS )
                                                else if ( reloc->r_symbolnum() != R_ABS )
-                                                       makeReference(kind, srcAddr, pointerValue);
+                                                       new Reference<x86>(kind, findAtomAndOffset(srcAddr), targetAO);
                                                else {
                                                        // find absolute symbol that corresponds to pointerValue
                                                        AddrToAtomMap::iterator pos = fAddrToAbsoluteAtom.find(pointerValue);
                                                else {
                                                        // find absolute symbol that corresponds to pointerValue
                                                        AddrToAtomMap::iterator pos = fAddrToAbsoluteAtom.find(pointerValue);
@@ -4583,10 +4665,7 @@ bool Reader<x86_64>::addRelocReference(const macho_section<x86_64::P>* sect, con
                                        kind = x86_64::kPointer32;
                                        break;
                                case 3:
                                        kind = x86_64::kPointer32;
                                        break;
                                case 3:
-                                       if ( reloc->r_extern() && isWeakImportSymbol(targetSymbol) )
-                                               kind = x86_64::kPointerWeakImport;
-                                       else
-                                               kind = x86_64::kPointer;
+                                       kind = x86_64::kPointer;
                                        break;
                        }
                        dstAddr = E::get64(*((uint64_t*)fixUpPtr));
                                        break;
                        }
                        dstAddr = E::get64(*((uint64_t*)fixUpPtr));
@@ -4986,7 +5065,7 @@ bool Reader<arm>::addRelocReference(const macho_section<arm::P>* sect,
                                }
                                else {
                                        AtomAndOffset at = findAtomAndOffset(srcAddr);
                                }
                                else {
                                        AtomAndOffset at = findAtomAndOffset(srcAddr);
-                                       AtomAndOffset to = findAtomAndOffset(pointerValue);
+                                       AtomAndOffset to = findAtomAndOffsetForSection(pointerValue, reloc->r_symbolnum());
                                        if ( to.atom->isThumb() )
                                                to.offset &= -2;
                                        new Reference<arm>(kind, at, to);
                                        if ( to.atom->isThumb() )
                                                to.offset &= -2;
                                        new Reference<arm>(kind, at, to);
@@ -5198,7 +5277,7 @@ const char* Reference<x86>::getDescription() const
                        sprintf(temp, "offset 0x%04X, absolute32 reference to ", fFixUpOffsetInSrc);
                        break;
                case x86::kImageOffset32:
                        sprintf(temp, "offset 0x%04X, absolute32 reference to ", fFixUpOffsetInSrc);
                        break;
                case x86::kImageOffset32:
-                       sprintf(temp, "offset 0x%04X, 32-bit offset of ", fFixUpOffsetInSrc);
+                       sprintf(temp, "offset 0x%04X, 32bit offset of ", fFixUpOffsetInSrc);
                        break;
                case x86::kPointerDiff24:
                        sprintf(temp, "offset 0x%04X, 24-bit pointer difference: (&%s + 0x%08X) - (&%s + 0x%08X)",
                        break;
                case x86::kPointerDiff24:
                        sprintf(temp, "offset 0x%04X, 24-bit pointer difference: (&%s + 0x%08X) - (&%s + 0x%08X)",
@@ -5206,9 +5285,6 @@ const char* Reference<x86>::getDescription() const
                                                           this->getFromTargetDisplayName(), fFromTarget.offset );
                        return temp;
                        break;
                                                           this->getFromTargetDisplayName(), fFromTarget.offset );
                        return temp;
                        break;
-               case x86::kSectionOffset24:
-                       sprintf(temp, "offset 0x%04X, 24-bit section offset of ", fFixUpOffsetInSrc);
-                       break;
                case x86::kDtraceProbe:
                        sprintf(temp, "offset 0x%04X, dtrace static probe ", fFixUpOffsetInSrc);
                        break;
                case x86::kDtraceProbe:
                        sprintf(temp, "offset 0x%04X, dtrace static probe ", fFixUpOffsetInSrc);
                        break;
@@ -5533,9 +5609,6 @@ const char* Reference<x86_64>::getDescription() const
                case x86_64::kImageOffset32:
                        sprintf(temp, "offset 0x%04llX, 32bit offset of ", fFixUpOffsetInSrc);
                        break;
                case x86_64::kImageOffset32:
                        sprintf(temp, "offset 0x%04llX, 32bit offset of ", fFixUpOffsetInSrc);
                        break;
-               case x86_64::kSectionOffset24:
-                       sprintf(temp, "offset 0x%04llX, 24-bit section offset of ", fFixUpOffsetInSrc);
-                       break;
                case x86_64::kDtraceProbe:
                        sprintf(temp, "offset 0x%04llX, dtrace static probe ", fFixUpOffsetInSrc);
                        break;
                case x86_64::kDtraceProbe:
                        sprintf(temp, "offset 0x%04llX, dtrace static probe ", fFixUpOffsetInSrc);
                        break;
index b019af26cf9bb838f5da6a3310b549c47106ef30..9e02efacf92a88781d667c99f1681dce776b3f4f 100644 (file)
@@ -453,7 +453,6 @@ private:
        std::vector<class ObjectFile::Atom*>                    fLocalSymbolAtoms;
        std::vector<macho_nlist<P> >                                    fLocalExtraLabels;
        std::vector<macho_nlist<P> >                                    fGlobalExtraLabels;
        std::vector<class ObjectFile::Atom*>                    fLocalSymbolAtoms;
        std::vector<macho_nlist<P> >                                    fLocalExtraLabels;
        std::vector<macho_nlist<P> >                                    fGlobalExtraLabels;
-       std::map<ObjectFile::Atom*, uint32_t>                   fAtomToSymbolIndex;
        class SectionRelocationsLinkEditAtom<A>*                fSectionRelocationsAtom;        
        class CompressedRebaseInfoLinkEditAtom<A>*              fCompressedRebaseInfoAtom;
        class CompressedBindingInfoLinkEditAtom<A>*             fCompressedBindingInfoAtom;
        class SectionRelocationsLinkEditAtom<A>*                fSectionRelocationsAtom;        
        class CompressedRebaseInfoLinkEditAtom<A>*              fCompressedRebaseInfoAtom;
        class CompressedBindingInfoLinkEditAtom<A>*             fCompressedBindingInfoAtom;
@@ -973,20 +972,17 @@ public:
        virtual void                                                                    copyRawContent(uint8_t buffer[]) const;
 
        void                                                                                    addUnwindInfo(ObjectFile::Atom* func, uint32_t offset, uint32_t encoding, 
        virtual void                                                                    copyRawContent(uint8_t buffer[]) const;
 
        void                                                                                    addUnwindInfo(ObjectFile::Atom* func, uint32_t offset, uint32_t encoding, 
-                                                                                                                       ObjectFile::Reference* fdeRef, ObjectFile::Reference* lsda,
-                                                                                                                        ObjectFile::Atom* personalityPointer);
+                                                                                                                       ObjectFile::Reference* lsda, ObjectFile::Atom* personalityPointer);
        void                                                                                    generate();
        
 private:
        using WriterAtom<A>::fWriter;
        typedef typename A::P                                   P;
        void                                                                                    generate();
        
 private:
        using WriterAtom<A>::fWriter;
        typedef typename A::P                                   P;
-       struct Info { ObjectFile::Atom* func; ObjectFile::Atom* fde; ObjectFile::Atom* lsda; uint32_t lsdaOffset; ObjectFile::Atom* personalityPointer; uint32_t encoding; };
+       struct Info { ObjectFile::Atom* func; ObjectFile::Atom* lsda; uint32_t lsdaOffset; ObjectFile::Atom* personalityPointer; uint32_t encoding; };
        struct LSDAEntry { ObjectFile::Atom* func; ObjectFile::Atom* lsda; uint32_t lsdaOffset; };
        struct LSDAEntry { ObjectFile::Atom* func; ObjectFile::Atom* lsda; uint32_t lsdaOffset; };
-       struct RegFixUp { uint8_t* contentPointer; ObjectFile::Atom* func; ObjectFile::Atom* fde; };
+       struct RegFixUp { uint8_t* contentPointer; ObjectFile::Atom* func; };
        struct CompressedFixUp { uint8_t* contentPointer; ObjectFile::Atom* func; ObjectFile::Atom* fromFunc; };
        struct CompressedFixUp { uint8_t* contentPointer; ObjectFile::Atom* func; ObjectFile::Atom* fromFunc; };
-       struct CompressedEncodingFixUp { uint8_t* contentPointer; ObjectFile::Atom* fde; };
 
 
-       bool                            encodingMeansUseDwarf(compact_unwind_encoding_t encoding);
        void                            compressDuplicates(std::vector<Info>& uniqueInfos);
        void                            findCommonEncoding(const std::vector<Info>& uniqueInfos, std::map<uint32_t, unsigned int>& commonEncodings);
        void                            makeLsdaIndex(const std::vector<Info>& uniqueInfos, std::map<ObjectFile::Atom*, uint32_t>& lsdaIndexOffsetMap);
        void                            compressDuplicates(std::vector<Info>& uniqueInfos);
        void                            findCommonEncoding(const std::vector<Info>& uniqueInfos, std::map<uint32_t, unsigned int>& commonEncodings);
        void                            makeLsdaIndex(const std::vector<Info>& uniqueInfos, std::map<ObjectFile::Atom*, uint32_t>& lsdaIndexOffsetMap);
@@ -1009,7 +1005,6 @@ private:
        std::vector<LSDAEntry>                                  fLSDAIndex;
        std::vector<RegFixUp>                                   fRegFixUps;
        std::vector<CompressedFixUp>                    fCompressedFixUps;
        std::vector<LSDAEntry>                                  fLSDAIndex;
        std::vector<RegFixUp>                                   fRegFixUps;
        std::vector<CompressedFixUp>                    fCompressedFixUps;
-       std::vector<CompressedEncodingFixUp>    fCompressedEncodingFixUps;
        std::vector<ObjectFile::Reference*>             fReferences;
 };
 
        std::vector<ObjectFile::Reference*>             fReferences;
 };
 
@@ -3240,8 +3235,6 @@ void Writer<A>::setExportNlist(const ObjectFile::Atom* atom, macho_nlist<P>* ent
         desc |= N_ARM_THUMB_DEF;
     if ( atom->getSymbolTableInclusion() == ObjectFile::Atom::kSymbolTableInAndNeverStrip )
         desc |= REFERENCED_DYNAMICALLY;
         desc |= N_ARM_THUMB_DEF;
     if ( atom->getSymbolTableInclusion() == ObjectFile::Atom::kSymbolTableInAndNeverStrip )
         desc |= REFERENCED_DYNAMICALLY;
-    if ( atom->dontDeadStrip() && (fOptions.outputKind() == Options::kObjectFile) )
-        desc |= N_NO_DEAD_STRIP;
     if ( atom->getDefinitionKind() == ObjectFile::Atom::kWeakDefinition ) {
         desc |= N_WEAK_DEF;
         fHasWeakExports = true;
     if ( atom->getDefinitionKind() == ObjectFile::Atom::kWeakDefinition ) {
         desc |= N_WEAK_DEF;
         fHasWeakExports = true;
@@ -3326,14 +3319,8 @@ void Writer<A>::setLocalNlist(const ObjectFile::Atom* atom, macho_nlist<P>* entr
        const char* symbolName = this->symbolTableName(atom);
        char anonName[32];
        if ( (fOptions.outputKind() == Options::kObjectFile) && !fOptions.keepLocalSymbol(symbolName) ) {
        const char* symbolName = this->symbolTableName(atom);
        char anonName[32];
        if ( (fOptions.outputKind() == Options::kObjectFile) && !fOptions.keepLocalSymbol(symbolName) ) {
-               if ( stringsNeedLabelsInObjects() && (atom->getContentType() == ObjectFile::Atom::kCStringType) ) {
-                       // don't use 'l' labels for x86_64 strings
-                       // <rdar://problem/6605499> x86_64 obj-c runtime confused when static lib is stripped
-               }
-               else {
-                       sprintf(anonName, "l%u", fAnonNameIndex++);
-                       symbolName = anonName;
-               }
+               sprintf(anonName, "l%u", fAnonNameIndex++);
+               symbolName = anonName;
        }
        entry->set_n_strx(this->fStringsAtom->add(symbolName));
 
        }
        entry->set_n_strx(this->fStringsAtom->add(symbolName));
 
@@ -3356,8 +3343,6 @@ void Writer<A>::setLocalNlist(const ObjectFile::Atom* atom, macho_nlist<P>* entr
 
        // set n_desc
        uint16_t desc = 0;
 
        // set n_desc
        uint16_t desc = 0;
-    if ( atom->dontDeadStrip() && (fOptions.outputKind() == Options::kObjectFile) )
-        desc |= N_NO_DEAD_STRIP;
        if ( atom->getDefinitionKind() == ObjectFile::Atom::kWeakDefinition )
                desc |= N_WEAK_DEF;
        if ( atom->isThumb() )
        if ( atom->getDefinitionKind() == ObjectFile::Atom::kWeakDefinition )
                desc |= N_WEAK_DEF;
        if ( atom->isThumb() )
@@ -3496,27 +3481,6 @@ void Writer<A>::buildSymbolTable()
        // set up module table
        if ( fModuleInfoAtom != NULL )
                fModuleInfoAtom->setName();
        // set up module table
        if ( fModuleInfoAtom != NULL )
                fModuleInfoAtom->setName();
-               
-       // create atom to symbol index map
-       // imports
-       int i = 0;
-       for(std::vector<ObjectFile::Atom*>::iterator it=fImportedAtoms.begin(); it != fImportedAtoms.end(); ++it) {
-               fAtomToSymbolIndex[*it] = i + fSymbolTableImportStartIndex;
-               ++i;
-       }
-       // locals
-       i = 0;
-       for(std::vector<ObjectFile::Atom*>::iterator it=fLocalSymbolAtoms.begin(); it != fLocalSymbolAtoms.end(); ++it) {
-               fAtomToSymbolIndex[*it] = i + fSymbolTableLocalStartIndex;
-               ++i;
-       }
-       // exports
-       i = 0;
-       for(std::vector<ObjectFile::Atom*>::iterator it=fExportedAtoms.begin(); it != fExportedAtoms.end(); ++it) {
-               fAtomToSymbolIndex[*it] = i + fSymbolTableExportStartIndex;
-               ++i;
-       }
-       
 }
 
 
 }
 
 
@@ -3726,9 +3690,30 @@ void Writer<A>::addStabs(uint32_t startIndex)
 template <typename A>
 uint32_t Writer<A>::symbolIndex(ObjectFile::Atom& atom)
 {
 template <typename A>
 uint32_t Writer<A>::symbolIndex(ObjectFile::Atom& atom)
 {
-       std::map<ObjectFile::Atom*, uint32_t>::iterator pos = fAtomToSymbolIndex.find(&atom);
-       if ( pos != fAtomToSymbolIndex.end() )
-               return pos->second;
+       // search imports
+       int i = 0;
+       for(std::vector<ObjectFile::Atom*>::iterator it=fImportedAtoms.begin(); it != fImportedAtoms.end(); ++it) {
+               if ( &atom == *it )
+                       return i + fSymbolTableImportStartIndex;
+               ++i;
+       }
+
+       // search locals
+       i = 0;
+       for(std::vector<ObjectFile::Atom*>::iterator it=fLocalSymbolAtoms.begin(); it != fLocalSymbolAtoms.end(); ++it) {
+               if ( &atom == *it )
+                       return i + fSymbolTableLocalStartIndex;
+               ++i;
+       }
+
+       // search exports
+       i = 0;
+       for(std::vector<ObjectFile::Atom*>::iterator it=fExportedAtoms.begin(); it != fExportedAtoms.end(); ++it) {
+               if ( &atom == *it )
+                       return i + fSymbolTableExportStartIndex;
+               ++i;
+       }
+
        throwf("atom not found in symbolIndex(%s) for %s", atom.getDisplayName(), atom.getFile()->getPath());
 }
 
        throwf("atom not found in symbolIndex(%s) for %s", atom.getDisplayName(), atom.getFile()->getPath());
 }
 
@@ -3933,9 +3918,6 @@ uint32_t Writer<x86_64>::addObjectRelocs(ObjectFile::Atom* atom, ObjectFile::Ref
                case x86_64::kImageOffset32:
                        throw "internal linker error, kImageOffset32 can't be encoded into object files";
 
                case x86_64::kImageOffset32:
                        throw "internal linker error, kImageOffset32 can't be encoded into object files";
 
-               case x86_64::kSectionOffset24:
-                       throw "internal linker error, kSectionOffset24 can't be encoded into object files";
-
                case x86_64::kDtraceTypeReference:
                case x86_64::kDtraceProbe:
                        // generates no relocs
                case x86_64::kDtraceTypeReference:
                case x86_64::kDtraceProbe:
                        // generates no relocs
@@ -4058,9 +4040,6 @@ uint32_t Writer<x86>::addObjectRelocs(ObjectFile::Atom* atom, ObjectFile::Refere
                case x86::kImageOffset32:
                        throw "internal linker error, kImageOffset32 can't be encoded into object files";
                        
                case x86::kImageOffset32:
                        throw "internal linker error, kImageOffset32 can't be encoded into object files";
                        
-               case x86::kSectionOffset24:
-                       throw "internal linker error, kSectionOffset24 can't be encoded into object files";
-
                case x86::kDtraceTypeReference:
                case x86::kDtraceProbe:
                        // generates no relocs
                case x86::kDtraceTypeReference:
                case x86::kDtraceProbe:
                        // generates no relocs
@@ -4759,6 +4738,14 @@ bool Writer<x86_64>::illegalRelocInFinalLinkedImage(const ObjectFile::Reference&
 template <>
 bool Writer<arm>::illegalRelocInFinalLinkedImage(const ObjectFile::Reference& ref)
 {
 template <>
 bool Writer<arm>::illegalRelocInFinalLinkedImage(const ObjectFile::Reference& ref)
 {
+       switch ( fOptions.outputKind()) {
+               case Options::kStaticExecutable:
+               case Options::kPreload:
+                       // all relocations allowed in static executables
+                       return false;
+               default:
+                       break;
+       }
        if ( ref.getKind() == arm::kReadOnlyPointer ) {
                switch ( ref.getTarget().getDefinitionKind() ) {
                        case ObjectFile::Atom::kTentativeDefinition:
        if ( ref.getKind() == arm::kReadOnlyPointer ) {
                switch ( ref.getTarget().getDefinitionKind() ) {
                        case ObjectFile::Atom::kTentativeDefinition:
@@ -4772,7 +4759,7 @@ bool Writer<arm>::illegalRelocInFinalLinkedImage(const ObjectFile::Reference& re
                                return true;
                        case ObjectFile::Atom::kAbsoluteSymbol:
                                // absolute symbbols only allowed in static executables
                                return true;
                        case ObjectFile::Atom::kAbsoluteSymbol:
                                // absolute symbbols only allowed in static executables
-                               return ( fOptions.outputKind() != Options::kStaticExecutable);
+                               return true;
                }
        }
        return false;
                }
        }
        return false;
@@ -5260,23 +5247,11 @@ void Writer<A>::buildExecutableFixups()
                                                                                        uint64_t addresss = atom->getAddress();
                                                                                        if ( targetRequiresWeakBinding(ref->getTarget()) ) {
                                                                                                fWeakBindingInfo.push_back(BindingInfo(type, ref->getTarget().getName(), false, addresss, 0));
                                                                                        uint64_t addresss = atom->getAddress();
                                                                                        if ( targetRequiresWeakBinding(ref->getTarget()) ) {
                                                                                                fWeakBindingInfo.push_back(BindingInfo(type, ref->getTarget().getName(), false, addresss, 0));
-                                                                                               // if this is a non-lazy pointer to a weak definition within this linkage unit
+                                                                                               // if this is a non-lazy pointer to a weak definition with this linkage unit
                                                                                                // the pointer needs to initially point within linkage unit and have
                                                                                                // the pointer needs to initially point within linkage unit and have
-                                                                                               // rebase command to slide it.
-                                                                                               if ( ref->getTarget().getDefinitionKind() == ObjectFile::Atom::kWeakDefinition ) {
-                                                                                                       // unless if this is a hybrid format, in which case the non-lazy pointer
-                                                                                                       // is zero on disk.  So use a bind instead of a rebase to set initial value
-                                                                                                       if ( fOptions.makeClassicDyldInfo() )
-                                                                                                               fBindingInfo.push_back(BindingInfo(type, BIND_SPECIAL_DYLIB_SELF, ref->getTarget().getName(), false, addresss, 0));
-                                                                                                       else
-                                                                                                               fRebaseInfo.push_back(RebaseInfo(REBASE_TYPE_POINTER,atom->getAddress()));
-                                                                                               }
-                                                                                               // if this is a non-lazy pointer to a weak definition in a dylib,
-                                                                                               // the pointer needs to initially bind to the dylib
-                                                                                               else if ( ref->getTarget().getDefinitionKind() == ObjectFile::Atom::kExternalWeakDefinition ) {
-                                                                                                       int ordinal = compressedOrdinalForImortedAtom(pointerTarget);
-                                                                                                       fBindingInfo.push_back(BindingInfo(BIND_TYPE_POINTER, ordinal, pointerTarget->getName(), false, addresss, 0));
-                                                                                               }
+                                                                                               // rease command to slide it.
+                                                                                               if ( ref->getTarget().getDefinitionKind() == ObjectFile::Atom::kWeakDefinition ) 
+                                                                                                       fRebaseInfo.push_back(RebaseInfo(REBASE_TYPE_POINTER,atom->getAddress()));
                                                                                        }
                                                                                        else {
                                                                                                int ordinal = compressedOrdinalForImortedAtom(pointerTarget);
                                                                                        }
                                                                                        else {
                                                                                                int ordinal = compressedOrdinalForImortedAtom(pointerTarget);
@@ -5345,16 +5320,6 @@ void Writer<A>::buildExecutableFixups()
                                                                                        uint8_t type = BIND_TYPE_POINTER;
                                                                                        if ( targetRequiresWeakBinding(ref->getTarget()) ) {
                                                                                                fWeakBindingInfo.push_back(BindingInfo(type, ref->getTarget().getName(), false, addresss, addend));
                                                                                        uint8_t type = BIND_TYPE_POINTER;
                                                                                        if ( targetRequiresWeakBinding(ref->getTarget()) ) {
                                                                                                fWeakBindingInfo.push_back(BindingInfo(type, ref->getTarget().getName(), false, addresss, addend));
-                                                                                               if ( fOptions.makeClassicDyldInfo() && (ref->getTarget().getDefinitionKind() == ObjectFile::Atom::kWeakDefinition) ) {
-                                                                                                       // hybrid linkedit puts addend in data, so we need bind phase to reset pointer to local definifion
-                                                                                                       fBindingInfo.push_back(BindingInfo(type, BIND_SPECIAL_DYLIB_SELF, ref->getTarget().getName(), false, addresss, addend));
-                                                                                               }
-                                                                                               // if this is a pointer to a weak definition in a dylib,
-                                                                                               // the pointer needs to initially bind to the dylib
-                                                                                               else if ( ref->getTarget().getDefinitionKind() == ObjectFile::Atom::kExternalWeakDefinition ) {
-                                                                                                       int ordinal = compressedOrdinalForImortedAtom(&ref->getTarget());
-                                                                                                       fBindingInfo.push_back(BindingInfo(BIND_TYPE_POINTER, ordinal, ref->getTarget().getName(), false, addresss, addend));
-                                                                                               }
                                                                                        }
                                                                                        else {
                                                                                                int ordinal = compressedOrdinalForImortedAtom(&ref->getTarget());
                                                                                        }
                                                                                        else {
                                                                                                int ordinal = compressedOrdinalForImortedAtom(&ref->getTarget());
@@ -6543,9 +6508,9 @@ void Writer<x86>::fixUpReferenceFinal(const ObjectFile::Reference* ref, const Ob
                                                                break;
                                                }
                                        } 
                                                                break;
                                                }
                                        } 
-                                       else if ( !fOptions.makeClassicDyldInfo() 
+                                       else if ( fOptions.makeCompressedDyldInfo()  
                                                                        && (ref->getTarget().getDefinitionKind() == ObjectFile::Atom::kWeakDefinition) ) {
                                                                        && (ref->getTarget().getDefinitionKind() == ObjectFile::Atom::kWeakDefinition) ) {
-                                               // when using only compressed dyld info, pointer is initially set to point directly to weak definition
+                                               // lazy pointer is initially set to point directly to weak definition
                                                LittleEndian::set32(*fixUp, ref->getTarget().getAddress() + ref->getTargetOffset());
                                        }
                                        else {
                                                LittleEndian::set32(*fixUp, ref->getTarget().getAddress() + ref->getTargetOffset());
                                        }
                                        else {
@@ -6579,15 +6544,6 @@ void Writer<x86>::fixUpReferenceFinal(const ObjectFile::Reference* ref, const Ob
                        temp |= (displacement & 0x00FFFFFF);
                        LittleEndian::set32(*fixUp, temp);
                        break;
                        temp |= (displacement & 0x00FFFFFF);
                        LittleEndian::set32(*fixUp, temp);
                        break;
-               case x86::kSectionOffset24:
-                       displacement = ref->getTarget().getSectionOffset();
-                       if ( (displacement > kSixteenMegLimit) || (displacement < 0) ) 
-                               throwf("24-bit pointer diff out of range in %s", inAtom->getDisplayName());
-                       temp = LittleEndian::get32(*fixUp);
-                       temp &= 0xFF000000;
-                       temp |= (displacement & 0x00FFFFFF);
-                       LittleEndian::set32(*fixUp, temp);
-                       break;
                case x86::kDtraceProbeSite:
                        // change call site to a NOP
                        dtraceProbeSite = (uint8_t*)fixUp;
                case x86::kDtraceProbeSite:
                        // change call site to a NOP
                        dtraceProbeSite = (uint8_t*)fixUp;
@@ -6777,8 +6733,6 @@ void Writer<x86>::fixUpReferenceRelocatable(const ObjectFile::Reference* ref, co
                        throw "internal linker error, kPointerDiff24 can't be encoded into object files";
                case x86::kImageOffset32:
                        throw "internal linker error, kImageOffset32 can't be encoded into object files";
                        throw "internal linker error, kPointerDiff24 can't be encoded into object files";
                case x86::kImageOffset32:
                        throw "internal linker error, kImageOffset32 can't be encoded into object files";
-               case x86::kSectionOffset24:
-                       throw "internal linker error, kSectionOffset24 can't be encoded into object files";
                case x86::kDtraceProbe:
                case x86::kDtraceTypeReference:
                        // nothing to fix up
                case x86::kDtraceProbe:
                case x86::kDtraceTypeReference:
                        // nothing to fix up
@@ -6808,9 +6762,9 @@ void Writer<x86_64>::fixUpReferenceFinal(const ObjectFile::Reference* ref, const
                                if ( &ref->getTarget() != NULL ) {
                                        //fprintf(stderr, "fixUpReferenceFinal: %s reference to %s\n", this->getDisplayName(), target.getDisplayName());
                                        if ( this->relocationNeededInFinalLinkedImage(ref->getTarget()) == kRelocExternal) {
                                if ( &ref->getTarget() != NULL ) {
                                        //fprintf(stderr, "fixUpReferenceFinal: %s reference to %s\n", this->getDisplayName(), target.getDisplayName());
                                        if ( this->relocationNeededInFinalLinkedImage(ref->getTarget()) == kRelocExternal) {
-                                               if ( !fOptions.makeClassicDyldInfo() 
-                                                                       && (ref->getTarget().getDefinitionKind() == ObjectFile::Atom::kWeakDefinition) ) {
-                                                       // when using only compressed dyld info, pointer is initially set to point directly to weak definition
+                                               if ( fOptions.makeCompressedDyldInfo() 
+                                                                               && (ref->getTarget().getDefinitionKind() == ObjectFile::Atom::kWeakDefinition) ) {
+                                                       // lazy pointer is initially set to point directly to weak definition
                                                        LittleEndian::set64(*fixUp, ref->getTarget().getAddress() + ref->getTargetOffset());
                                                }
                                                else {
                                                        LittleEndian::set64(*fixUp, ref->getTarget().getAddress() + ref->getTargetOffset());
                                                }
                                                else {
@@ -6879,15 +6833,6 @@ void Writer<x86_64>::fixUpReferenceFinal(const ObjectFile::Reference* ref, const
                        temp |= (displacement & 0x00FFFFFF);
                        LittleEndian::set32(*((uint32_t*)fixUp), temp);
                        break;
                        temp |= (displacement & 0x00FFFFFF);
                        LittleEndian::set32(*((uint32_t*)fixUp), temp);
                        break;
-               case x86_64::kSectionOffset24:
-                       displacement = ref->getTarget().getSectionOffset();
-                       if ( (displacement > kSixteenMegLimit) || (displacement < 0) ) 
-                               throwf("24-bit pointer diff out of range in %s", inAtom->getDisplayName());
-                       temp = LittleEndian::get32(*((uint32_t*)fixUp));
-                       temp &= 0xFF000000;
-                       temp |= (displacement & 0x00FFFFFF);
-                       LittleEndian::set32(*((uint32_t*)fixUp), temp);
-                       break;
                case x86_64::kPCRel32GOTLoad:
                case x86_64::kPCRel32GOTLoadWeakImport:
                        // if GOT entry was optimized away, change movq instruction to a leaq
                case x86_64::kPCRel32GOTLoad:
                case x86_64::kPCRel32GOTLoadWeakImport:
                        // if GOT entry was optimized away, change movq instruction to a leaq
@@ -7105,8 +7050,6 @@ void Writer<x86_64>::fixUpReferenceRelocatable(const ObjectFile::Reference* ref,
                        throw "internal linker error, kPointerDiff24 can't be encoded into object files";
                case x86_64::kImageOffset32:
                        throw "internal linker error, kImageOffset32 can't be encoded into object files";
                        throw "internal linker error, kPointerDiff24 can't be encoded into object files";
                case x86_64::kImageOffset32:
                        throw "internal linker error, kImageOffset32 can't be encoded into object files";
-               case x86_64::kSectionOffset24:
-                       throw "internal linker error, kSectionOffset24 can't be encoded into object files";
                case x86_64::kDtraceTypeReference:
                case x86_64::kDtraceProbe:
                        // nothing to fix up
                case x86_64::kDtraceTypeReference:
                case x86_64::kDtraceProbe:
                        // nothing to fix up
@@ -8310,12 +8253,12 @@ void Writer<A>::synthesizeUnwindInfoTable()
                        if ( atom->beginUnwind() == atom->endUnwind() ) {
                                // be sure to mark that we have no unwind info for stuff in the TEXT segment without unwind info
                                if ( strcmp(atom->getSegment().getName(), "__TEXT") == 0 )
                        if ( atom->beginUnwind() == atom->endUnwind() ) {
                                // be sure to mark that we have no unwind info for stuff in the TEXT segment without unwind info
                                if ( strcmp(atom->getSegment().getName(), "__TEXT") == 0 )
-                                       fUnwindInfoAtom->addUnwindInfo(atom, 0, 0, NULL, NULL, NULL);
+                                       fUnwindInfoAtom->addUnwindInfo(atom, 0, 0, NULL, NULL);
                        }
                        else {
                                // atom has unwind 
                                for ( ObjectFile::UnwindInfo::iterator uit = atom->beginUnwind(); uit != atom->endUnwind(); ++uit ) {
                        }
                        else {
                                // atom has unwind 
                                for ( ObjectFile::UnwindInfo::iterator uit = atom->beginUnwind(); uit != atom->endUnwind(); ++uit ) {
-                                       fUnwindInfoAtom->addUnwindInfo(atom, uit->startOffset, uit->unwindInfo, atom->getFDE(), atom->getLSDA(), atom->getPersonalityPointer());
+                                       fUnwindInfoAtom->addUnwindInfo(atom, uit->startOffset, uit->unwindInfo, atom->getLSDA(), atom->getPersonalityPointer());
                                }
                        }
                }
                                }
                        }
                }
@@ -10045,15 +9988,10 @@ void LoadCommandsPaddingAtom<A>::setSize(uint64_t newSize)
 
 template <typename A>
 void UnwindInfoAtom<A>::addUnwindInfo(ObjectFile::Atom* func, uint32_t offset, uint32_t encoding, 
 
 template <typename A>
 void UnwindInfoAtom<A>::addUnwindInfo(ObjectFile::Atom* func, uint32_t offset, uint32_t encoding, 
-                                                                               ObjectFile::Reference* fdeRef, ObjectFile::Reference* lsdaRef,
-                                                                               ObjectFile::Atom* personalityPointer) 
+                                                                                               ObjectFile::Reference* lsdaRef, ObjectFile::Atom* personalityPointer) 
 { 
        Info info;
        info.func = func;
 { 
        Info info;
        info.func = func;
-       if ( fdeRef != NULL )  
-               info.fde = &fdeRef->getTarget();
-       else 
-               info.fde = NULL;
        if ( lsdaRef != NULL )  {
                info.lsda = &lsdaRef->getTarget();
                info.lsdaOffset = lsdaRef->getTargetOffset();
        if ( lsdaRef != NULL )  {
                info.lsda = &lsdaRef->getTarget();
                info.lsdaOffset = lsdaRef->getTargetOffset();
@@ -10069,24 +10007,6 @@ void UnwindInfoAtom<A>::addUnwindInfo(ObjectFile::Atom* func, uint32_t offset, u
        //                              encoding, info.lsda, info.lsdaOffset, personalityPointer, func->getDisplayName());
 }
 
        //                              encoding, info.lsda, info.lsdaOffset, personalityPointer, func->getDisplayName());
 }
 
-template <>
-bool UnwindInfoAtom<x86>::encodingMeansUseDwarf(compact_unwind_encoding_t encoding)
-{
-       return ( (encoding & UNWIND_X86_MODE_MASK) == UNWIND_X86_MODE_DWARF);
-}
-
-template <>
-bool UnwindInfoAtom<x86_64>::encodingMeansUseDwarf(compact_unwind_encoding_t encoding)
-{
-       return ( (encoding & UNWIND_X86_64_MODE_MASK) == UNWIND_X86_64_MODE_DWARF);
-}
-
-template <typename A>
-bool UnwindInfoAtom<A>::encodingMeansUseDwarf(compact_unwind_encoding_t encoding)
-{
-       return false;
-}
-
 
 template <typename A>
 void UnwindInfoAtom<A>::compressDuplicates(std::vector<Info>& uniqueInfos)
 
 template <typename A>
 void UnwindInfoAtom<A>::compressDuplicates(std::vector<Info>& uniqueInfos)
@@ -10100,10 +10020,9 @@ void UnwindInfoAtom<A>::compressDuplicates(std::vector<Info>& uniqueInfos)
        last.personalityPointer = NULL;
        last.encoding = 0xFFFFFFFF;
        for(typename std::vector<Info>::iterator it=fInfos.begin(); it != fInfos.end(); ++it) {
        last.personalityPointer = NULL;
        last.encoding = 0xFFFFFFFF;
        for(typename std::vector<Info>::iterator it=fInfos.begin(); it != fInfos.end(); ++it) {
-               Info& newInfo = *it;
-               bool newNeedsDwarf = encodingMeansUseDwarf(newInfo.encoding);
+               Info newInfo = *it;
                // remove infos which have same encoding and personalityPointer as last one
                // remove infos which have same encoding and personalityPointer as last one
-               if ( newNeedsDwarf || (newInfo.encoding != last.encoding) || (newInfo.personalityPointer != last.personalityPointer) 
+               if ( (newInfo.encoding != last.encoding) || (newInfo.personalityPointer != last.personalityPointer) 
                                                || (newInfo.lsda != NULL) || (last.lsda != NULL) ) {
                        uniqueInfos.push_back(newInfo);
                }
                                                || (newInfo.lsda != NULL) || (last.lsda != NULL) ) {
                        uniqueInfos.push_back(newInfo);
                }
@@ -10119,9 +10038,6 @@ void UnwindInfoAtom<A>::findCommonEncoding(const std::vector<Info>& uniqueInfos,
        std::map<uint32_t, unsigned int> encodingsUsed;
        unsigned int mostCommonEncodingUsageCount = 0;
        for(typename std::vector<Info>::const_iterator it=uniqueInfos.begin(); it != uniqueInfos.end(); ++it) {
        std::map<uint32_t, unsigned int> encodingsUsed;
        unsigned int mostCommonEncodingUsageCount = 0;
        for(typename std::vector<Info>::const_iterator it=uniqueInfos.begin(); it != uniqueInfos.end(); ++it) {
-               // never put dwarf into common table
-               if ( encodingMeansUseDwarf(it->encoding) )
-                       continue;
                std::map<uint32_t, unsigned int>::iterator pos = encodingsUsed.find(it->encoding);
                if ( pos == encodingsUsed.end() ) {
                        encodingsUsed[it->encoding] = 1;
                std::map<uint32_t, unsigned int>::iterator pos = encodingsUsed.find(it->encoding);
                if ( pos == encodingsUsed.end() ) {
                        encodingsUsed[it->encoding] = 1;
@@ -10197,8 +10113,7 @@ unsigned int UnwindInfoAtom<A>::makeRegularSecondLevelPage(const std::vector<Inf
                RegFixUp fixup;
                fixup.contentPointer = (uint8_t*)(&entryTable[i]);
                fixup.func = info.func;
                RegFixUp fixup;
                fixup.contentPointer = (uint8_t*)(&entryTable[i]);
                fixup.func = info.func;
-               fixup.fde = ( encodingMeansUseDwarf(info.encoding) ? info.fde : NULL );
-               fRegFixUps.push_back(fixup);
+               fRegFixUps.push_back(fixup);
        }
        //fprintf(stderr, "regular page with %u entries\n", entriesToAdd);
        pageEnd = pageStart;
        }
        //fprintf(stderr, "regular page with %u entries\n", entriesToAdd);
        pageEnd = pageStart;
@@ -10212,7 +10127,6 @@ unsigned int UnwindInfoAtom<A>::makeCompressedSecondLevelPage(const std::vector<
                                                                                                                        uint32_t pageSize, unsigned int endIndex, uint8_t*& pageEnd)
 {
        const bool log = false;
                                                                                                                        uint32_t pageSize, unsigned int endIndex, uint8_t*& pageEnd)
 {
        const bool log = false;
-       if (log) fprintf(stderr, "makeCompressedSecondLevelPage(pageSize=%u, endIndex=%u)\n", pageSize, endIndex);
        // first pass calculates how many compressed entries we could fit in this sized page
        // keep adding entries to page until:
        //  1) encoding table plus entry table plus header exceed page size
        // first pass calculates how many compressed entries we could fit in this sized page
        // keep adding entries to page until:
        //  1) encoding table plus entry table plus header exceed page size
@@ -10235,20 +10149,14 @@ unsigned int UnwindInfoAtom<A>::makeCompressedSecondLevelPage(const std::vector<
                        encodingIndex = pos->second;
                }
                else {
                        encodingIndex = pos->second;
                }
                else {
-                       // no commmon entry, so add one on this page
-                       uint32_t encoding = info.encoding;
-                       if ( encodingMeansUseDwarf(encoding) ) {
-                               // make unique pseudo encoding so this dwarf will gets is own encoding entry slot
-                               encoding += (index+1);
-                       }
-                       std::map<uint32_t, unsigned int>::iterator ppos = pageSpecificEncodings.find(encoding);
+                       std::map<uint32_t, unsigned int>::iterator ppos = pageSpecificEncodings.find(info.encoding);
                        if ( ppos != pageSpecificEncodings.end() ) {
                                encodingIndex = pos->second;
                        }
                        else {
                                encodingIndex = commonEncodings.size() + pageSpecificEncodings.size();
                                if ( encodingIndex <= 255 ) {
                        if ( ppos != pageSpecificEncodings.end() ) {
                                encodingIndex = pos->second;
                        }
                        else {
                                encodingIndex = commonEncodings.size() + pageSpecificEncodings.size();
                                if ( encodingIndex <= 255 ) {
-                                       pageSpecificEncodings[encoding] = encodingIndex;
+                                       pageSpecificEncodings[info.encoding] = encodingIndex;
                                }
                                else {
                                        canDo = false; // case 3)
                                }
                                else {
                                        canDo = false; // case 3)
@@ -10270,72 +10178,52 @@ unsigned int UnwindInfoAtom<A>::makeCompressedSecondLevelPage(const std::vector<
                        ++entryCount;
                }
                // check room for entry
                        ++entryCount;
                }
                // check room for entry
-               if ( (pageSpecificEncodings.size()+entryCount) >= space4 ) {
+               if ( (pageSpecificEncodings.size()+entryCount) > space4 ) {
                        canDo = false; // case 1)
                        --entryCount;
                        if (log) fprintf(stderr, "end of compressed page with %u entries because full\n", entryCount);
                }
                        canDo = false; // case 1)
                        --entryCount;
                        if (log) fprintf(stderr, "end of compressed page with %u entries because full\n", entryCount);
                }
-               //if (log) fprintf(stderr, "space4=%d, pageSpecificEncodings.size()=%ld, entryCount=%d\n", space4, pageSpecificEncodings.size(), entryCount);
        }
        
        }
        
-       // check for cases where it would be better to use a regular (non-compressed) page
-       const unsigned int compressPageUsed = sizeof(unwind_info_compressed_second_level_page_header) 
+       // sanity check that we fit more entries into this page than a regular page would hold
+       const int compressPageUsed = sizeof(unwind_info_compressed_second_level_page_header) 
                                                                + pageSpecificEncodings.size()*sizeof(uint32_t)
                                                                + entryCount*sizeof(uint32_t);
                                                                + pageSpecificEncodings.size()*sizeof(uint32_t)
                                                                + entryCount*sizeof(uint32_t);
-       if ( (compressPageUsed < (pageSize-4) && (index >= 0) ) ) {
-               const int regularEntriesPerPage = (pageSize - sizeof(unwind_info_regular_second_level_page_header))/sizeof(unwind_info_regular_second_level_entry);
-               if ( entryCount < regularEntriesPerPage ) {
-                       return makeRegularSecondLevelPage(uniqueInfos, pageSize, endIndex, pageEnd);
-               }
+       const int regularEntriesPerPage = (compressPageUsed - sizeof(unwind_info_regular_second_level_page_header))/sizeof(unwind_info_regular_second_level_entry);
+       if ( entryCount < regularEntriesPerPage ) {
+               return makeRegularSecondLevelPage(uniqueInfos, pageSize, endIndex, pageEnd);
        }
        }
-       
-       // check if we need any padding because adding another entry would take 8 bytes but only have room for 4
-       uint32_t pad = 0;
-       if ( compressPageUsed == (pageSize-4) )
-               pad = 4;
-       
+
        // second pass fills in page 
        // second pass fills in page 
-       uint8_t* pageStart = pageEnd - compressPageUsed - pad;
+       uint8_t* pageStart = pageEnd - compressPageUsed;
        macho_unwind_info_compressed_second_level_page_header<P>* page = (macho_unwind_info_compressed_second_level_page_header<P>*)pageStart;
        page->set_kind(UNWIND_SECOND_LEVEL_COMPRESSED);
        page->set_entryPageOffset(sizeof(macho_unwind_info_compressed_second_level_page_header<P>));
        page->set_entryCount(entryCount);
        page->set_encodingsPageOffset(page->entryPageOffset()+entryCount*sizeof(uint32_t));
        page->set_encodingsCount(pageSpecificEncodings.size());
        macho_unwind_info_compressed_second_level_page_header<P>* page = (macho_unwind_info_compressed_second_level_page_header<P>*)pageStart;
        page->set_kind(UNWIND_SECOND_LEVEL_COMPRESSED);
        page->set_entryPageOffset(sizeof(macho_unwind_info_compressed_second_level_page_header<P>));
        page->set_entryCount(entryCount);
        page->set_encodingsPageOffset(page->entryPageOffset()+entryCount*sizeof(uint32_t));
        page->set_encodingsCount(pageSpecificEncodings.size());
-       uint32_t* const encodingsArray = (uint32_t*)&pageStart[page->encodingsPageOffset()];
        // fill in entry table
        uint32_t* const entiresArray = (uint32_t*)&pageStart[page->entryPageOffset()];
        ObjectFile::Atom* firstFunc = uniqueInfos[endIndex-entryCount].func;
        for(unsigned int i=endIndex-entryCount; i < endIndex; ++i) {
                const Info& info = uniqueInfos[i];
                uint8_t encodingIndex;
        // fill in entry table
        uint32_t* const entiresArray = (uint32_t*)&pageStart[page->entryPageOffset()];
        ObjectFile::Atom* firstFunc = uniqueInfos[endIndex-entryCount].func;
        for(unsigned int i=endIndex-entryCount; i < endIndex; ++i) {
                const Info& info = uniqueInfos[i];
                uint8_t encodingIndex;
-               if ( encodingMeansUseDwarf(info.encoding) ) {
-                       // dwarf entries are always in page specific encodings
-                       encodingIndex = pageSpecificEncodings[info.encoding+i];
-               }
-               else {
-                       std::map<uint32_t, unsigned int>::const_iterator pos = commonEncodings.find(info.encoding);
-                       if ( pos != commonEncodings.end() ) 
-                               encodingIndex = pos->second;
-                       else 
-                               encodingIndex = pageSpecificEncodings[info.encoding];
-               }
+               std::map<uint32_t, unsigned int>::const_iterator pos = commonEncodings.find(info.encoding);
+               if ( pos != commonEncodings.end() ) 
+                       encodingIndex = pos->second;
+               else 
+                       encodingIndex = pageSpecificEncodings[info.encoding];
                uint32_t entryIndex = i - endIndex + entryCount;
                A::P::E::set32(entiresArray[entryIndex], encodingIndex << 24);
                uint32_t entryIndex = i - endIndex + entryCount;
                A::P::E::set32(entiresArray[entryIndex], encodingIndex << 24);
-               CompressedFixUp                 funcStartFixUp;
-               funcStartFixUp.contentPointer = (uint8_t*)(&entiresArray[entryIndex]);
-               funcStartFixUp.func = info.func;
-               funcStartFixUp.fromFunc = firstFunc;
-               fCompressedFixUps.push_back(funcStartFixUp);
-               if ( encodingMeansUseDwarf(info.encoding) ) {
-                       CompressedEncodingFixUp dwarfStartFixup;
-                       dwarfStartFixup.contentPointer = (uint8_t*)(&encodingsArray[encodingIndex-commonEncodings.size()]); 
-                       dwarfStartFixup.fde = info.fde;
-                       fCompressedEncodingFixUps.push_back(dwarfStartFixup);
-               }
+               CompressedFixUp fixup;
+               fixup.contentPointer = (uint8_t*)(&entiresArray[entryIndex]);
+               fixup.func = info.func;
+               fixup.fromFunc = firstFunc;
+               fCompressedFixUps.push_back(fixup);
        }
        // fill in encodings table
        }
        // fill in encodings table
-       for(std::map<uint32_t, unsigned int>::const_iterator it = pageSpecificEncodings.begin(); it != pageSpecificEncodings.end(); ++it) {
+       uint32_t* const encodingsArray = (uint32_t*)&pageStart[page->encodingsPageOffset()];
+       for(std::map<uint32_t, unsigned int>::iterator it = pageSpecificEncodings.begin(); it != pageSpecificEncodings.end(); ++it) {
                A::P::E::set32(encodingsArray[it->second-commonEncodings.size()], it->first);
        }
        
                A::P::E::set32(encodingsArray[it->second-commonEncodings.size()], it->first);
        }
        
@@ -10383,8 +10271,8 @@ void UnwindInfoAtom<A>::generate()
                fPagesSize = 0;
                if ( fPagesContentForDelete == NULL )
                        throw "could not allocate space for compact unwind info";
                fPagesSize = 0;
                if ( fPagesContentForDelete == NULL )
                        throw "could not allocate space for compact unwind info";
-               ObjectFile::Atom* secondLevelFirstFuncs[pageCount*3];
-               uint8_t* secondLevelPagesStarts[pageCount*3];
+               ObjectFile::Atom* secondLevelFirstFuncs[pageCount];
+               uint8_t* secondLevelPagesStarts[pageCount];
                
                // make last second level page smaller so that all other second level pages can be page aligned
                uint32_t maxLastPageSize = unwindSectionInfo->fFileOffset % 4096;
                
                // make last second level page smaller so that all other second level pages can be page aligned
                uint32_t maxLastPageSize = unwindSectionInfo->fFileOffset % 4096;
@@ -10478,18 +10366,12 @@ void UnwindInfoAtom<A>::generate()
                for (typename std::vector<RegFixUp>::iterator it = fRegFixUps.begin(); it != fRegFixUps.end(); ++it) {
                        uint32_t offset = (it->contentPointer - fPagesContent) + fHeaderSize;
                        fReferences.push_back(new WriterReference<A>(offset, A::kImageOffset32, it->func));
                for (typename std::vector<RegFixUp>::iterator it = fRegFixUps.begin(); it != fRegFixUps.end(); ++it) {
                        uint32_t offset = (it->contentPointer - fPagesContent) + fHeaderSize;
                        fReferences.push_back(new WriterReference<A>(offset, A::kImageOffset32, it->func));
-                       if ( it->fde != NULL )
-                               fReferences.push_back(new WriterReference<A>(offset+4, A::kSectionOffset24, it->fde));
                }
                // make references for compressed second level entries
                for (typename std::vector<CompressedFixUp>::iterator it = fCompressedFixUps.begin(); it != fCompressedFixUps.end(); ++it) {
                        uint32_t offset = (it->contentPointer - fPagesContent) + fHeaderSize;
                        fReferences.push_back(new WriterReference<A>(offset, A::kPointerDiff24, it->func, 0, it->fromFunc, 0));
                }
                }
                // make references for compressed second level entries
                for (typename std::vector<CompressedFixUp>::iterator it = fCompressedFixUps.begin(); it != fCompressedFixUps.end(); ++it) {
                        uint32_t offset = (it->contentPointer - fPagesContent) + fHeaderSize;
                        fReferences.push_back(new WriterReference<A>(offset, A::kPointerDiff24, it->func, 0, it->fromFunc, 0));
                }
-               for (typename std::vector<CompressedEncodingFixUp>::iterator it = fCompressedEncodingFixUps.begin(); it != fCompressedEncodingFixUps.end(); ++it) {
-                       uint32_t offset = (it->contentPointer - fPagesContent) + fHeaderSize;
-                       fReferences.push_back(new WriterReference<A>(offset, A::kSectionOffset24, it->fde));
-               }
                                
                // update section record with new size
                unwindSectionInfo->fSize = this->getSize();
                                
                // update section record with new size
                unwindSectionInfo->fSize = this->getSize();
@@ -11236,7 +11118,7 @@ void CompressedBindingInfoLinkEditAtom<A>::encode()
        std::vector<binding_tmp> mid;
        const SegmentInfo* currentSegment = NULL;
        unsigned int segIndex = 0;
        std::vector<binding_tmp> mid;
        const SegmentInfo* currentSegment = NULL;
        unsigned int segIndex = 0;
-       int ordinal = 0x80000000;
+       int ordinal = 0;
        const char* symbolName = NULL;
        uint8_t type = 0;
        uint64_t address = (uint64_t)(-1);
        const char* symbolName = NULL;
        uint8_t type = 0;
        uint64_t address = (uint64_t)(-1);
@@ -11340,12 +11222,10 @@ void CompressedBindingInfoLinkEditAtom<A>::encode()
                        p->opcode = BIND_OPCODE_DO_BIND_ADD_ADDR_IMM_SCALED;
                        p->operand1 = p->operand1/sizeof(pint_t);
                }
                        p->opcode = BIND_OPCODE_DO_BIND_ADD_ADDR_IMM_SCALED;
                        p->operand1 = p->operand1/sizeof(pint_t);
                }
-               else if ( (p->opcode == BIND_OPCODE_SET_DYLIB_ORDINAL_ULEB) && (p->operand1 <= 15) ) {
-                       p->opcode = BIND_OPCODE_SET_DYLIB_ORDINAL_IMM;
-               }
        }       
        dst->opcode = BIND_OPCODE_DONE;
 
        }       
        dst->opcode = BIND_OPCODE_DONE;
 
+
        // convert to compressed encoding
        const static bool log = false;
        fEncodedData.reserve(info.size()*2);
        // convert to compressed encoding
        const static bool log = false;
        fEncodedData.reserve(info.size()*2);
index 8b9a2d3ac4679e299bea3f9b4383f266e2cc42e6..87396fbeed1df24af9ef82f19f023de122ba7340 100644 (file)
@@ -66,11 +66,12 @@ public:
                                                                                fForFinalLinkedImage(false), fNoEHLabels(false), fForStatic(false), fForDyld(false), fMakeTentativeDefinitionsReal(false), 
                                                                                fWhyLoad(false), fRootSafe(false), fSetuidSafe(false),fDebugInfoStripping(kDebugInfoFull),
                                                                                fImplicitlyLinkPublicDylibs(true),
                                                                                fForFinalLinkedImage(false), fNoEHLabels(false), fForStatic(false), fForDyld(false), fMakeTentativeDefinitionsReal(false), 
                                                                                fWhyLoad(false), fRootSafe(false), fSetuidSafe(false),fDebugInfoStripping(kDebugInfoFull),
                                                                                fImplicitlyLinkPublicDylibs(true),
-                                                                               fAddCompactUnwindEncoding(true), 
+                                                                               fAddCompactUnwindEncoding(false), 
                                                                                fWarnCompactUnwind(false),
                                                                                fRemoveDwarfUnwindIfCompactExists(false),
                                                                                fMakeCompressedDyldInfo(false),
                                                                                fAutoOrderInitializers(true),
                                                                                fWarnCompactUnwind(false),
                                                                                fRemoveDwarfUnwindIfCompactExists(false),
                                                                                fMakeCompressedDyldInfo(false),
                                                                                fAutoOrderInitializers(true),
+                                                                               fOptimizeZeroFill(true),
                                                                                fLogObjectFiles(false), fLogAllFiles(false),
                                                                                fTraceDylibs(false), fTraceIndirectDylibs(false), fTraceArchives(false), 
                                                                                fTraceOutputFile(NULL), fMacVersionMin(kMinMacVersionUnset), fIPhoneVersionMin(kMinIPhoneVersionUnset) {}
                                                                                fLogObjectFiles(false), fLogAllFiles(false),
                                                                                fTraceDylibs(false), fTraceIndirectDylibs(false), fTraceArchives(false), 
                                                                                fTraceOutputFile(NULL), fMacVersionMin(kMinMacVersionUnset), fIPhoneVersionMin(kMinIPhoneVersionUnset) {}
@@ -102,6 +103,7 @@ public:
        bool                                    fRemoveDwarfUnwindIfCompactExists;
        bool                                    fMakeCompressedDyldInfo;
        bool                                    fAutoOrderInitializers;
        bool                                    fRemoveDwarfUnwindIfCompactExists;
        bool                                    fMakeCompressedDyldInfo;
        bool                                    fAutoOrderInitializers;
+       bool                                    fOptimizeZeroFill;
        bool                                    fLogObjectFiles;
        bool                                    fLogAllFiles;
        bool                                    fTraceDylibs;
        bool                                    fLogObjectFiles;
        bool                                    fLogAllFiles;
        bool                                    fTraceDylibs;
@@ -280,7 +282,7 @@ class Atom
 public:
        enum Scope { scopeTranslationUnit, scopeLinkageUnit, scopeGlobal };
        enum DefinitionKind { kRegularDefinition, kWeakDefinition, kTentativeDefinition, kExternalDefinition, kExternalWeakDefinition, kAbsoluteSymbol };
 public:
        enum Scope { scopeTranslationUnit, scopeLinkageUnit, scopeGlobal };
        enum DefinitionKind { kRegularDefinition, kWeakDefinition, kTentativeDefinition, kExternalDefinition, kExternalWeakDefinition, kAbsoluteSymbol };
-       enum ContentType { kUnclassifiedType, kCStringType, kCFIType, kLSDAType };
+       enum ContentType { kUnclassifiedType, kCStringType, kCFIType, kLSDAType, kSectionStart, kSectionEnd };
        enum SymbolTableInclusion { kSymbolTableNotIn, kSymbolTableIn, kSymbolTableInAndNeverStrip, kSymbolTableInAsAbsolute };
 
        virtual Reader*                                                 getFile() const = 0;
        enum SymbolTableInclusion { kSymbolTableNotIn, kSymbolTableIn, kSymbolTableInAndNeverStrip, kSymbolTableInAsAbsolute };
 
        virtual Reader*                                                 getFile() const = 0;
@@ -308,7 +310,6 @@ public:
        virtual UnwindInfo::iterator                    beginUnwind() { return NULL; }
        virtual UnwindInfo::iterator                    endUnwind() { return NULL; }
        virtual Reference*                                              getLSDA() { return NULL; }
        virtual UnwindInfo::iterator                    beginUnwind() { return NULL; }
        virtual UnwindInfo::iterator                    endUnwind() { return NULL; }
        virtual Reference*                                              getLSDA() { return NULL; }
-       virtual Reference*                                              getFDE() { return NULL; }
        virtual Atom*                                                   getPersonalityPointer() { return NULL; }
 
                        uint64_t                                                getSectionOffset() const        { return fSectionOffset; }
        virtual Atom*                                                   getPersonalityPointer() { return NULL; }
 
                        uint64_t                                                getSectionOffset() const        { return fSectionOffset; }
index 03969cdc089aa672d92f2ab14d38f1c17a56f5bc..58bb74cdc1a3bee6d9797ef5c65e7ba91a545b5e 100644 (file)
@@ -101,7 +101,8 @@ Options::Options(int argc, const char* argv[])
          fSharedRegionEligible(false), fPrintOrderFileStatistics(false),  
          fReadOnlyx86Stubs(false), fPositionIndependentExecutable(false), fMaxMinimumHeaderPad(false),
          fDeadStripDylibs(false),  fAllowTextRelocs(false), fWarnTextRelocs(false), 
          fSharedRegionEligible(false), fPrintOrderFileStatistics(false),  
          fReadOnlyx86Stubs(false), fPositionIndependentExecutable(false), fMaxMinimumHeaderPad(false),
          fDeadStripDylibs(false),  fAllowTextRelocs(false), fWarnTextRelocs(false), 
-         fUsingLazyDylibLinking(false), fEncryptable(true), fOrderData(true), fMarkDeadStrippableDylib(false),
+         fUsingLazyDylibLinking(false), fEncryptable(true), 
+         fOrderData(true), fMarkDeadStrippableDylib(false),
          fMakeClassicDyldInfo(true), fMakeCompressedDyldInfo(true), fAllowCpuSubtypeMismatches(false), fSaveTempFiles(false)
 {
        this->checkForClassic(argc, argv);
          fMakeClassicDyldInfo(true), fMakeCompressedDyldInfo(true), fAllowCpuSubtypeMismatches(false), fSaveTempFiles(false)
 {
        this->checkForClassic(argc, argv);
@@ -2510,6 +2511,9 @@ void Options::parse(int argc, const char* argv[])
                        else if ( strcmp(arg, "-allow_sub_type_mismatches") == 0 ) {
                                fAllowCpuSubtypeMismatches = true;
                        }
                        else if ( strcmp(arg, "-allow_sub_type_mismatches") == 0 ) {
                                fAllowCpuSubtypeMismatches = true;
                        }
+                       else if ( strcmp(arg, "-no_zero_fill_sections") == 0 ) {
+                               fReaderOptions.fOptimizeZeroFill = false;
+                       }
                        else {
                                throwf("unknown option: %s", arg);
                        }
                        else {
                                throwf("unknown option: %s", arg);
                        }
@@ -2776,6 +2780,7 @@ void Options::parsePostCommandLineEnvironmentSettings()
        // allow build system to force on -warn_commons
        if ( getenv("LD_WARN_COMMONS") != NULL )
                fWarnCommons = true;
        // allow build system to force on -warn_commons
        if ( getenv("LD_WARN_COMMONS") != NULL )
                fWarnCommons = true;
+               
 }
 
 void Options::reconfigureDefaults()
 }
 
 void Options::reconfigureDefaults()
@@ -3064,7 +3069,7 @@ void Options::reconfigureDefaults()
                fEncryptable = false;
        if ( fArchitecture != CPU_TYPE_ARM )
                fEncryptable = false;
                fEncryptable = false;
        if ( fArchitecture != CPU_TYPE_ARM )
                fEncryptable = false;
-       
+
        // don't move inits in dyld because dyld wants certain
        // entries point at stable locations at the start of __text
        if ( fOutputKind == Options::kDyld ) 
        // don't move inits in dyld because dyld wants certain
        // entries point at stable locations at the start of __text
        if ( fOutputKind == Options::kDyld ) 
@@ -3125,6 +3130,11 @@ void Options::reconfigureDefaults()
        // only ARM enforces that cpu-sub-types must match
        if ( fArchitecture != CPU_TYPE_ARM )
                fAllowCpuSubtypeMismatches = true;
        // only ARM enforces that cpu-sub-types must match
        if ( fArchitecture != CPU_TYPE_ARM )
                fAllowCpuSubtypeMismatches = true;
+               
+       // only final linked images can not optimize zero fill sections
+       if ( fOutputKind == Options::kObjectFile )
+               fReaderOptions.fOptimizeZeroFill = true;
+               
 }
 
 void Options::checkIllegalOptionCombinations()
 }
 
 void Options::checkIllegalOptionCombinations()
@@ -3464,6 +3474,12 @@ void Options::checkIllegalOptionCombinations()
                }
        }
        
                }
        }
        
+       // -force_cpusubtype_ALL is not supported for ARM
+       if ( fForceSubtypeAll ) {
+               if ( fArchitecture == CPU_TYPE_ARM ) {
+                       warning("-force_cpusubtype_ALL will become unsupported for ARM architectures");
+               }
+       }
 }      
 
 
 }      
 
 
index ded2a19adfda871053e788abd05cfd1ccd2f1c50..6d93c0b9359f1b3c4d578faa08374f1209b4862f 100644 (file)
@@ -1,5 +1,5 @@
 /* -*- mode: C++; c-basic-offset: 4; tab-width: 4 -*-*
 /* -*- mode: C++; c-basic-offset: 4; tab-width: 4 -*-*
- * Copyright (c) 2005-2009 Apple Inc. All rights reserved.
+ * Copyright (c) 2005-2007 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  *
  *
  * @APPLE_LICENSE_HEADER_START@
  *
@@ -86,11 +86,11 @@ public:
 class Section : public ObjectFile::Section
 {
 public:
 class Section : public ObjectFile::Section
 {
 public:
-       static Section* find(const char* sectionName, const char* segmentName, bool zeroFill, bool createIfNeeded=true);
+       static Section* find(const char* sectionName, const char* segmentName, bool zeroFill, bool untrustedZeroFill, bool createIfNeeded=true);
        static void             assignIndexes();
        const char*             getName() { return fSectionName; }
 private:
        static void             assignIndexes();
        const char*             getName() { return fSectionName; }
 private:
-                                       Section(const char* sectionName, const char* segmentName, bool zeroFill);
+                                       Section(const char* sectionName, const char* segmentName, bool zeroFill, bool untrustedZeroFill);
 
        struct Sorter {
                static int      segmentOrdinal(const char* segName);
 
        struct Sorter {
                static int      segmentOrdinal(const char* segName);
@@ -101,9 +101,10 @@ private:
        typedef __gnu_cxx::hash_map<const char*, class Section*, __gnu_cxx::hash<const char*>, CStringEquals> NameToSection;
        //typedef std::map<const char*, class Section*, CStringComparor> NameToSection;
 
        typedef __gnu_cxx::hash_map<const char*, class Section*, __gnu_cxx::hash<const char*>, CStringEquals> NameToSection;
        //typedef std::map<const char*, class Section*, CStringComparor> NameToSection;
 
-       char                    fSectionName[18];
-       char                    fSegmentName[18];
+       const char*             fSectionName;
+       const char*             fSegmentName;
        bool                    fZeroFill;
        bool                    fZeroFill;
+       bool                    fUntrustedZeroFill;
 
        static NameToSection                    fgMapping;
        static std::vector<Section*>    fgSections;
 
        static NameToSection                    fgMapping;
        static std::vector<Section*>    fgSections;
@@ -114,12 +115,9 @@ Section::NameToSection     Section::fgMapping;
 std::vector<Section*>  Section::fgSections;
 Section::NameToOrdinal Section::fgSegmentDiscoverOrder;
 
 std::vector<Section*>  Section::fgSections;
 Section::NameToOrdinal Section::fgSegmentDiscoverOrder;
 
-Section::Section(const char* sectionName, const char* segmentName, bool zeroFill)
- : fZeroFill(zeroFill)
+Section::Section(const char* sectionName, const char* segmentName, bool zeroFill, bool untrustedZeroFill)
+ : fSectionName(sectionName), fSegmentName(segmentName), fZeroFill(zeroFill), fUntrustedZeroFill(untrustedZeroFill)
 {
 {
-       strlcpy(fSectionName, sectionName, sizeof(fSectionName));
-       strlcpy(fSegmentName, segmentName, sizeof(fSegmentName));
-       
        this->fIndex = fgSections.size() + 20;  // room for 20 standard sections
        // special placement of some sections
        if ( strcmp(segmentName, "__TEXT") == 0 ) {
        this->fIndex = fgSections.size() + 20;  // room for 20 standard sections
        // special placement of some sections
        if ( strcmp(segmentName, "__TEXT") == 0 ) {
@@ -179,12 +177,17 @@ Section::Section(const char* sectionName, const char* segmentName, bool zeroFill
        //fprintf(stderr, "new Section(%s, %s) => %p, %u\n", sectionName, segmentName, this, this->getIndex());
 }
 
        //fprintf(stderr, "new Section(%s, %s) => %p, %u\n", sectionName, segmentName, this, this->getIndex());
 }
 
-Section* Section::find(const char* sectionName, const char* segmentName, bool zeroFill, bool createIfNeeded)
+Section* Section::find(const char* sectionName, const char* segmentName, bool zeroFill, bool untrustedZeroFill, bool createIfNeeded)
 {
        NameToSection::iterator pos = fgMapping.find(sectionName);
        if ( pos != fgMapping.end() ) {
 {
        NameToSection::iterator pos = fgMapping.find(sectionName);
        if ( pos != fgMapping.end() ) {
-               if ( strcmp(pos->second->fSegmentName, segmentName) == 0 )
+               if ( strcmp(pos->second->fSegmentName, segmentName) == 0 ) {
+                       if ( !untrustedZeroFill && pos->second->fUntrustedZeroFill ) {
+                               pos->second->fZeroFill = zeroFill;
+                               pos->second->fUntrustedZeroFill = false;
+                       }
                        return pos->second;
                        return pos->second;
+               }
                // otherwise same section name is used in different segments, look slow way
                for (std::vector<Section*>::iterator it=fgSections.begin(); it != fgSections.end(); it++) {
                        if ( (strcmp((*it)->fSectionName, sectionName) == 0) && (strcmp((*it)->fSegmentName, segmentName) == 0) )
                // otherwise same section name is used in different segments, look slow way
                for (std::vector<Section*>::iterator it=fgSections.begin(); it != fgSections.end(); it++) {
                        if ( (strcmp((*it)->fSectionName, sectionName) == 0) && (strcmp((*it)->fSegmentName, segmentName) == 0) )
@@ -196,13 +199,13 @@ Section* Section::find(const char* sectionName, const char* segmentName, bool ze
                return NULL;
        
        // does not exist, so make a new one
                return NULL;
        
        // does not exist, so make a new one
-       Section* sect = new Section(sectionName, segmentName, zeroFill);
+       Section* sect = new Section(sectionName, segmentName, zeroFill, untrustedZeroFill);
        fgMapping[sectionName] = sect;
        fgSections.push_back(sect);
 
        if ( (strcmp(sectionName, "__text") == 0) && (strcmp(segmentName, "__TEXT") == 0) ) {
                // special case __StaticInit to be right after __text
        fgMapping[sectionName] = sect;
        fgSections.push_back(sect);
 
        if ( (strcmp(sectionName, "__text") == 0) && (strcmp(segmentName, "__TEXT") == 0) ) {
                // special case __StaticInit to be right after __text
-               find("__StaticInit", "__TEXT", false);
+               find("__StaticInit", "__TEXT", false, true);
        }
 
        // remember segment discovery order
        }
 
        // remember segment discovery order
@@ -658,7 +661,7 @@ void Linker::optimize()
                for(std::vector<class ObjectFile::Atom*>::iterator itr = fAllAtoms.begin(); itr != fAllAtoms.end(); ++itr) {
                        ObjectFile::Atom *atom = *itr;
                        if ( atom->getSection() == NULL )
                for(std::vector<class ObjectFile::Atom*>::iterator itr = fAllAtoms.begin(); itr != fAllAtoms.end(); ++itr) {
                        ObjectFile::Atom *atom = *itr;
                        if ( atom->getSection() == NULL )
-                               atom->setSection(Section::find(atom->getSectionName(), atom->getSegment().getName(), atom->isZeroFill()));
+                               atom->setSection(Section::find(atom->getSectionName(), atom->getSegment().getName(), atom->isZeroFill(), true));
                }
 
                // resolve new undefines
                }
 
                // resolve new undefines
@@ -871,8 +874,17 @@ inline void Linker::addAtom(ObjectFile::Atom& atom)
        }
 
        // record section orders so output file can have same order
        }
 
        // record section orders so output file can have same order
-       if (atom.getSectionName())
-               atom.setSection(Section::find(atom.getSectionName(), atom.getSegment().getName(), atom.isZeroFill()));
+       if (atom.getSectionName()) {
+               bool untrusted = false;
+               switch ( atom.getContentType() ) {
+                       case ObjectFile::Atom::kSectionStart:
+                       case ObjectFile::Atom::kSectionEnd:
+                               untrusted = true;
+                       default:
+                               break;
+               }
+               atom.setSection(Section::find(atom.getSectionName(), atom.getSegment().getName(), atom.isZeroFill(), untrusted));
+       }
 }
 
 
 }
 
 
@@ -2213,7 +2225,7 @@ void Linker::tweakLayout()
                        throwf("total output size exceeds 2GB (%lldMB)", (fTotalSize-fTotalZeroFillSize)/(1024*1024));          
 
                // move very large (>1MB) zero fill atoms to a new section at very end of __DATA segment
                        throwf("total output size exceeds 2GB (%lldMB)", (fTotalSize-fTotalZeroFillSize)/(1024*1024));          
 
                // move very large (>1MB) zero fill atoms to a new section at very end of __DATA segment
-               Section* hugeZeroFills = Section::find("__huge", "__DATA", true);
+               Section* hugeZeroFills = Section::find("__huge", "__DATA", true, true);
                for (std::vector<ObjectFile::Atom*>::iterator it=fAllAtoms.begin(); it != fAllAtoms.end(); it++) {
                        ObjectFile::Atom* atom = *it;
                        if ( atom->isZeroFill() && (atom->getSize() > 1024*1024) && (strcmp(atom->getSegment().getName(), "__DATA") == 0) )
                for (std::vector<ObjectFile::Atom*>::iterator it=fAllAtoms.begin(); it != fAllAtoms.end(); it++) {
                        ObjectFile::Atom* atom = *it;
                        if ( atom->isZeroFill() && (atom->getSize() > 1024*1024) && (strcmp(atom->getSegment().getName(), "__DATA") == 0) )
@@ -2232,7 +2244,7 @@ void Linker::tweakLayout()
                }
                
                // move all functions pointed to by __mod_init_func section to front of __text
                }
                
                // move all functions pointed to by __mod_init_func section to front of __text
-               Section* initSection = Section::find("__mod_init_func", "__DATA", false, false);
+               Section* initSection = Section::find("__mod_init_func", "__DATA", false, true, false);
                if ( initSection != NULL ) {
                        for (std::vector<ObjectFile::Atom*>::iterator it=fAllAtoms.begin(); it != fAllAtoms.end(); ++it) {
                                if ( (*it)->getSection() == initSection ) {
                if ( initSection != NULL ) {
                        for (std::vector<ObjectFile::Atom*>::iterator it=fAllAtoms.begin(); it != fAllAtoms.end(); ++it) {
                                if ( (*it)->getSection() == initSection ) {
@@ -2263,7 +2275,7 @@ void Linker::tweakLayout()
                                break;
                }
                const bool hasPreferredLoadAddress = (fOptions.baseAddress() != 0);
                                break;
                }
                const bool hasPreferredLoadAddress = (fOptions.baseAddress() != 0);
-               Section* dataSection = Section::find("__data", "__DATA", false, false);
+               Section* dataSection = Section::find("__data", "__DATA", false, true, false);
                if ( dataSection != NULL ) {
                        for (std::vector<ObjectFile::Atom*>::iterator it=fAllAtoms.begin(); it != fAllAtoms.end(); ++it) {
                                ObjectFile::Atom* dataAtom = *it;
                if ( dataSection != NULL ) {
                        for (std::vector<ObjectFile::Atom*>::iterator it=fAllAtoms.begin(); it != fAllAtoms.end(); ++it) {
                                ObjectFile::Atom* dataAtom = *it;
@@ -3984,6 +3996,12 @@ bool Linker::AtomSorter::operator()(const ObjectFile::Atom* left, const ObjectFi
        unsigned int rightSectionIndex = right->getSection()->getIndex();
        if ( leftSectionIndex != rightSectionIndex)
                return (leftSectionIndex < rightSectionIndex);
        unsigned int rightSectionIndex = right->getSection()->getIndex();
        if ( leftSectionIndex != rightSectionIndex)
                return (leftSectionIndex < rightSectionIndex);
+       
+       // magic section$start symbol always sorts to the start of its section
+       if ( left->getContentType() == ObjectFile::Atom::kSectionStart )
+               return true;
+       if ( right->getContentType() == ObjectFile::Atom::kSectionStart )
+               return false;
 
        // if a -order_file is specified, then sorting is altered to sort those symbols first
        if ( fOverriddenOrdinalMap != NULL ) {
 
        // if a -order_file is specified, then sorting is altered to sort those symbols first
        if ( fOverriddenOrdinalMap != NULL ) {
@@ -4019,6 +4037,12 @@ bool Linker::AtomSorter::operator()(const ObjectFile::Atom* left, const ObjectFi
        if ( leftIsTent != rightIsTent )
                return rightIsTent; 
        
        if ( leftIsTent != rightIsTent )
                return rightIsTent; 
        
+       // magic section$end symbol always sorts to the end of its section
+       if ( left->getContentType() == ObjectFile::Atom::kSectionEnd )
+               return false;
+       if ( right->getContentType() == ObjectFile::Atom::kSectionEnd )
+               return true;
+
        // initializers are auto sorted to start of section
        if ( !fInitializerSet.empty() ) {
                bool leftFirst  = (fInitializerSet.count(left) != 0);
        // initializers are auto sorted to start of section
        if ( !fInitializerSet.empty() ) {
                bool leftFirst  = (fInitializerSet.count(left) != 0);
index 016fda3073efb66f3b320f33eb8263d962ed3ad4..4af50ffde46c07e1c1df11f5cb2e36d020132523 100644 (file)
@@ -722,7 +722,7 @@ void DyldInfoPrinter<A>::printBindingInfo()
        }
        else {
                printf("bind information:\n");
        }
        else {
                printf("bind information:\n");
-               printf("segment section          address        type   weak  addend dylib            symbol\n");
+               printf("segment section          address        type     addend dylib            symbol\n");
                const uint8_t* p = (uint8_t*)fHeader + fInfo->bind_off();
                const uint8_t* end = &p[fInfo->bind_size()];
                
                const uint8_t* p = (uint8_t*)fHeader + fInfo->bind_off();
                const uint8_t* end = &p[fInfo->bind_size()];
                
@@ -738,7 +738,6 @@ void DyldInfoPrinter<A>::printBindingInfo()
                pint_t segStartAddr = 0;
                const char* segName = "??";
                const char* typeName = "??";
                pint_t segStartAddr = 0;
                const char* segName = "??";
                const char* typeName = "??";
-               const char* weak_import = "";
                bool done = false;
                while ( !done && (p < end) ) {
                        uint8_t immediate = *p & BIND_IMMEDIATE_MASK;
                bool done = false;
                while ( !done && (p < end) ) {
                        uint8_t immediate = *p & BIND_IMMEDIATE_MASK;
@@ -771,10 +770,6 @@ void DyldInfoPrinter<A>::printBindingInfo()
                                        while (*p != '\0')
                                                ++p;
                                        ++p;
                                        while (*p != '\0')
                                                ++p;
                                        ++p;
-                                       if ( (immediate & BIND_SYMBOL_FLAGS_WEAK_IMPORT) != 0 )
-                                               weak_import = "weak";
-                                       else
-                                               weak_import = "";
                                        break;
                                case BIND_OPCODE_SET_TYPE_IMM:
                                        type = immediate;
                                        break;
                                case BIND_OPCODE_SET_TYPE_IMM:
                                        type = immediate;
@@ -793,22 +788,22 @@ void DyldInfoPrinter<A>::printBindingInfo()
                                        segOffset += read_uleb128(p, end);
                                        break;
                                case BIND_OPCODE_DO_BIND:
                                        segOffset += read_uleb128(p, end);
                                        break;
                                case BIND_OPCODE_DO_BIND:
-                                       printf("%-7s %-16s 0x%08llX %10s %4s  %5lld %-16s %s\n", segName, sectionName(segIndex, segStartAddr+segOffset), segStartAddr+segOffset, typeName, weak_import, addend, fromDylib, symbolName );
+                                       printf("%-7s %-16s 0x%08llX %10s   %5lld %-16s %s\n", segName, sectionName(segIndex, segStartAddr+segOffset), segStartAddr+segOffset, typeName, addend, fromDylib, symbolName );
                                        segOffset += sizeof(pint_t);
                                        break;
                                case BIND_OPCODE_DO_BIND_ADD_ADDR_ULEB:
                                        segOffset += sizeof(pint_t);
                                        break;
                                case BIND_OPCODE_DO_BIND_ADD_ADDR_ULEB:
-                                       printf("%-7s %-16s 0x%08llX %10s %4s  %5lld %-16s %s\n", segName, sectionName(segIndex, segStartAddr+segOffset), segStartAddr+segOffset, typeName, weak_import, addend, fromDylib, symbolName );
+                                       printf("%-7s %-16s 0x%08llX %10s   %5lld %-16s %s\n", segName, sectionName(segIndex, segStartAddr+segOffset), segStartAddr+segOffset, typeName, addend, fromDylib, symbolName );
                                        segOffset += read_uleb128(p, end) + sizeof(pint_t);
                                        break;
                                case BIND_OPCODE_DO_BIND_ADD_ADDR_IMM_SCALED:
                                        segOffset += read_uleb128(p, end) + sizeof(pint_t);
                                        break;
                                case BIND_OPCODE_DO_BIND_ADD_ADDR_IMM_SCALED:
-                                       printf("%-7s %-16s 0x%08llX %10s %4s  %5lld %-16s %s\n", segName, sectionName(segIndex, segStartAddr+segOffset), segStartAddr+segOffset, typeName, weak_import, addend, fromDylib, symbolName );
+                                       printf("%-7s %-16s 0x%08llX %10s   %5lld %-16s %s\n", segName, sectionName(segIndex, segStartAddr+segOffset), segStartAddr+segOffset, typeName, addend, fromDylib, symbolName );
                                        segOffset += immediate*sizeof(pint_t) + sizeof(pint_t);
                                        break;
                                case BIND_OPCODE_DO_BIND_ULEB_TIMES_SKIPPING_ULEB:
                                        count = read_uleb128(p, end);
                                        skip = read_uleb128(p, end);
                                        for (uint32_t i=0; i < count; ++i) {
                                        segOffset += immediate*sizeof(pint_t) + sizeof(pint_t);
                                        break;
                                case BIND_OPCODE_DO_BIND_ULEB_TIMES_SKIPPING_ULEB:
                                        count = read_uleb128(p, end);
                                        skip = read_uleb128(p, end);
                                        for (uint32_t i=0; i < count; ++i) {
-                                               printf("%-7s %-16s 0x%08llX %10s %4s  %5lld %-16s %s\n", segName, sectionName(segIndex, segStartAddr+segOffset), segStartAddr+segOffset, typeName, weak_import, addend, fromDylib, symbolName );
+                                               printf("%-7s %-16s 0x%08llX %10s   %5lld %-16s %s\n", segName, sectionName(segIndex, segStartAddr+segOffset), segStartAddr+segOffset, typeName, addend, fromDylib, symbolName );
                                                segOffset += skip + sizeof(pint_t);
                                        }
                                        break;
                                                segOffset += skip + sizeof(pint_t);
                                        }
                                        break;
index 098d93270ee0e43ff8978bf7926c09b80bb43088..d8d699dc1502c66665cc32945cfdec17a4cfb254 100644 (file)
@@ -83,7 +83,6 @@ private:
        void                                                                            getSymbolTableInfo();
        const char*                                                                     functionName(pint_t addr);
        static const char*                                                      archName();
        void                                                                            getSymbolTableInfo();
        const char*                                                                     functionName(pint_t addr);
        static const char*                                                      archName();
-       static void                                                                     decode(uint32_t encoding, const uint8_t* funcStart, char* str);
                
        const char*                                                                     fPath;
        const macho_header<P>*                                          fHeader;
                
        const char*                                                                     fPath;
        const macho_header<P>*                                          fHeader;
@@ -252,7 +251,7 @@ const char* UnwindPrinter<A>::functionName(pint_t addr)
                        }
                }
        }
                        }
                }
        }
-       return "--anonymous function--";
+       return "??";
 }
 
 
 }
 
 
@@ -289,379 +288,8 @@ bool UnwindPrinter<A>::findUnwindSection()
        return false;
 }
        
        return false;
 }
        
-#define EXTRACT_BITS(value, mask) \
-       ( (value >> __builtin_ctz(mask)) & (((1 << __builtin_popcount(mask)))-1) )
 
 
 
 
-template <>
-void UnwindPrinter<x86_64>::decode(uint32_t encoding, const uint8_t* funcStart, char* str)
-{
-       *str = '\0';
-       switch ( encoding & UNWIND_X86_64_MODE_MASK ) {
-               case UNWIND_X86_64_MODE_RBP_FRAME:
-               {
-                       uint32_t savedRegistersOffset = EXTRACT_BITS(encoding, UNWIND_X86_64_RBP_FRAME_OFFSET);
-                       uint32_t savedRegistersLocations = EXTRACT_BITS(encoding, UNWIND_X86_64_RBP_FRAME_REGISTERS);
-                       if ( savedRegistersLocations == 0 ) {
-                               strcpy(str, "rbp frame, no saved registers");
-                       }
-                       else {
-                               sprintf(str, "rbp frame, at -%d:", savedRegistersOffset*8);
-                               bool needComma = false;
-                               for (int i=0; i < 5; ++i) {
-                                       if ( needComma ) 
-                                               strcat(str, ",");
-                                       else
-                                               needComma = true;
-                                       switch (savedRegistersLocations & 0x7) {
-                                               case UNWIND_X86_64_REG_NONE:
-                                                       strcat(str, "-");
-                                                       break;
-                                               case UNWIND_X86_64_REG_RBX:
-                                                       strcat(str, "rbx");
-                                                       break;
-                                               case UNWIND_X86_64_REG_R12:
-                                                       strcat(str, "r12");
-                                                       break;
-                                               case UNWIND_X86_64_REG_R13:
-                                                       strcat(str, "r13");
-                                                       break;
-                                               case UNWIND_X86_64_REG_R14:
-                                                       strcat(str, "r14");
-                                                       break;
-                                               case UNWIND_X86_64_REG_R15:
-                                                       strcat(str, "r15");
-                                                       break;
-                                               default:
-                                                       strcat(str, "r?");
-                                       }
-                                       savedRegistersLocations = (savedRegistersLocations >> 3);
-                                       if ( savedRegistersLocations == 0 )
-                                               break;
-                               }
-                       }
-               }
-               break;
-               case UNWIND_X86_64_MODE_STACK_IMMD:
-               case UNWIND_X86_64_MODE_STACK_IND:
-               {
-                       uint32_t stackSize = EXTRACT_BITS(encoding, UNWIND_X86_64_FRAMELESS_STACK_SIZE);
-                       uint32_t stackAdjust = EXTRACT_BITS(encoding, UNWIND_X86_64_FRAMELESS_STACK_ADJUST);
-                       uint32_t regCount = EXTRACT_BITS(encoding, UNWIND_X86_64_FRAMELESS_STACK_REG_COUNT);
-                       uint32_t permutation = EXTRACT_BITS(encoding, UNWIND_X86_64_FRAMELESS_STACK_REG_PERMUTATION);
-                       if ( (encoding & UNWIND_X86_64_MODE_MASK) == UNWIND_X86_64_MODE_STACK_IND ) {
-                               // stack size is encoded in subl $xxx,%esp instruction
-                               uint32_t subl = x86_64::P::E::get32(*((uint32_t*)(funcStart+stackSize)));
-                               sprintf(str, "stack size=0x%08X, ", subl + 8*stackAdjust);
-                       }
-                       else {
-                               sprintf(str, "stack size=%d, ", stackSize*8);
-                       }
-                       if ( regCount == 0 ) {
-                               strcat(str, "no registers saved");
-                       }
-                       else {
-                               int permunreg[6];
-                               switch ( regCount ) {
-                                       case 6:
-                                               permunreg[0] = permutation/120;
-                                               permutation -= (permunreg[0]*120);
-                                               permunreg[1] = permutation/24;
-                                               permutation -= (permunreg[1]*24);
-                                               permunreg[2] = permutation/6;
-                                               permutation -= (permunreg[2]*6);
-                                               permunreg[3] = permutation/2;
-                                               permutation -= (permunreg[3]*2);
-                                               permunreg[4] = permutation;
-                                               permunreg[5] = 0;
-                                               break;
-                                       case 5:
-                                               permunreg[0] = permutation/120;
-                                               permutation -= (permunreg[0]*120);
-                                               permunreg[1] = permutation/24;
-                                               permutation -= (permunreg[1]*24);
-                                               permunreg[2] = permutation/6;
-                                               permutation -= (permunreg[2]*6);
-                                               permunreg[3] = permutation/2;
-                                               permutation -= (permunreg[3]*2);
-                                               permunreg[4] = permutation;
-                                               break;
-                                       case 4:
-                                               permunreg[0] = permutation/60;
-                                               permutation -= (permunreg[0]*60);
-                                               permunreg[1] = permutation/12;
-                                               permutation -= (permunreg[1]*12);
-                                               permunreg[2] = permutation/3;
-                                               permutation -= (permunreg[2]*3);
-                                               permunreg[3] = permutation;
-                                               break;
-                                       case 3:
-                                               permunreg[0] = permutation/20;
-                                               permutation -= (permunreg[0]*20);
-                                               permunreg[1] = permutation/4;
-                                               permutation -= (permunreg[1]*4);
-                                               permunreg[2] = permutation;
-                                               break;
-                                       case 2:
-                                               permunreg[0] = permutation/5;
-                                               permutation -= (permunreg[0]*5);
-                                               permunreg[1] = permutation;
-                                               break;
-                                       case 1:
-                                               permunreg[0] = permutation;
-                                               break;
-                               }
-                               // renumber registers back to standard numbers
-                               int registers[6];
-                               bool used[7] = { false, false, false, false, false, false, false };
-                               for (int i=0; i < regCount; ++i) {
-                                       int renum = 0; 
-                                       for (int u=1; u < 7; ++u) {
-                                               if ( !used[u] ) {
-                                                       if ( renum == permunreg[i] ) {
-                                                               registers[i] = u;
-                                                               used[u] = true;
-                                                               break;
-                                                       }
-                                                       ++renum;
-                                               }
-                                       }
-                               }
-                               bool needComma = false;
-                               for (int i=0; i < regCount; ++i) {
-                                       if ( needComma ) 
-                                               strcat(str, ",");
-                                       else
-                                               needComma = true;
-                                       switch ( registers[i] ) {
-                                               case UNWIND_X86_64_REG_RBX:
-                                                       strcat(str, "rbx");
-                                                       break;
-                                               case UNWIND_X86_64_REG_R12:
-                                                       strcat(str, "r12");
-                                                       break;
-                                               case UNWIND_X86_64_REG_R13:
-                                                       strcat(str, "r13");
-                                                       break;
-                                               case UNWIND_X86_64_REG_R14:
-                                                       strcat(str, "r14");
-                                                       break;
-                                               case UNWIND_X86_64_REG_R15:
-                                                       strcat(str, "r15");
-                                                       break;
-                                               case UNWIND_X86_64_REG_RBP:
-                                                       strcat(str, "rbp");
-                                                       break;
-                                               default:
-                                                       strcat(str, "r??");
-                                       }
-                               }
-                       }
-               }
-               break;
-               case UNWIND_X86_64_MODE_DWARF:
-                       sprintf(str, "dwarf offset 0x%08X, ", encoding & UNWIND_X86_64_DWARF_SECTION_OFFSET);
-                       break;
-               default:
-                       if ( encoding == 0 )
-                               strcat(str, "no unwind information");
-                       else
-                               strcat(str, "tbd ");
-       }
-       if ( encoding & UNWIND_HAS_LSDA ) {
-               strcat(str, " LSDA");
-       }
-
-}
-
-template <>
-void UnwindPrinter<x86>::decode(uint32_t encoding, const uint8_t* funcStart, char* str)
-{
-       *str = '\0';
-       switch ( encoding & UNWIND_X86_MODE_MASK ) {
-               case UNWIND_X86_MODE_EBP_FRAME:
-               {
-                       uint32_t savedRegistersOffset = EXTRACT_BITS(encoding, UNWIND_X86_EBP_FRAME_OFFSET);
-                       uint32_t savedRegistersLocations = EXTRACT_BITS(encoding, UNWIND_X86_EBP_FRAME_REGISTERS);
-                       if ( savedRegistersLocations == 0 ) {
-                               strcpy(str, "ebp frame, no saved registers");
-                       }
-                       else {
-                               sprintf(str, "ebp frame, at -%d:", savedRegistersOffset*4);
-                               bool needComma = false;
-                               for (int i=0; i < 5; ++i) {
-                                       if ( needComma ) 
-                                               strcat(str, ",");
-                                       else
-                                               needComma = true;
-                                       switch (savedRegistersLocations & 0x7) {
-                                               case UNWIND_X86_REG_NONE:
-                                                       strcat(str, "-");
-                                                       break;
-                                               case UNWIND_X86_REG_EBX:
-                                                       strcat(str, "ebx");
-                                                       break;
-                                               case UNWIND_X86_REG_ECX:
-                                                       strcat(str, "ecx");
-                                                       break;
-                                               case UNWIND_X86_REG_EDX:
-                                                       strcat(str, "edx");
-                                                       break;
-                                               case UNWIND_X86_REG_EDI:
-                                                       strcat(str, "edi");
-                                                       break;
-                                               case UNWIND_X86_REG_ESI:
-                                                       strcat(str, "esi");
-                                                       break;
-                                               default:
-                                                       strcat(str, "e??");
-                                       }
-                                       savedRegistersLocations = (savedRegistersLocations >> 3);
-                                       if ( savedRegistersLocations == 0 )
-                                               break;
-                               }
-                       }
-               }
-               break;
-               case UNWIND_X86_MODE_STACK_IMMD:
-               case UNWIND_X86_MODE_STACK_IND:
-               {
-                       uint32_t stackSize = EXTRACT_BITS(encoding, UNWIND_X86_FRAMELESS_STACK_SIZE);
-                       uint32_t stackAdjust = EXTRACT_BITS(encoding, UNWIND_X86_FRAMELESS_STACK_ADJUST);
-                       uint32_t regCount = EXTRACT_BITS(encoding, UNWIND_X86_FRAMELESS_STACK_REG_COUNT);
-                       uint32_t permutation = EXTRACT_BITS(encoding, UNWIND_X86_FRAMELESS_STACK_REG_PERMUTATION);
-                       if ( (encoding & UNWIND_X86_MODE_MASK) == UNWIND_X86_MODE_STACK_IND ) {
-                               // stack size is encoded in subl $xxx,%esp instruction
-                               uint32_t subl = x86::P::E::get32(*((uint32_t*)(funcStart+stackSize)));
-                               sprintf(str, "stack size=0x%08X, ", subl+4*stackAdjust);
-                       }
-                       else {
-                               sprintf(str, "stack size=%d, ", stackSize*4);
-                       }
-                       if ( regCount == 0 ) {
-                               strcat(str, "no saved regs");
-                       }
-                       else {
-                               int permunreg[6];
-                               switch ( regCount ) {
-                                       case 6:
-                                               permunreg[0] = permutation/120;
-                                               permutation -= (permunreg[0]*120);
-                                               permunreg[1] = permutation/24;
-                                               permutation -= (permunreg[1]*24);
-                                               permunreg[2] = permutation/6;
-                                               permutation -= (permunreg[2]*6);
-                                               permunreg[3] = permutation/2;
-                                               permutation -= (permunreg[3]*2);
-                                               permunreg[4] = permutation;
-                                               permunreg[5] = 0;
-                                               break;
-                                       case 5:
-                                               permunreg[0] = permutation/120;
-                                               permutation -= (permunreg[0]*120);
-                                               permunreg[1] = permutation/24;
-                                               permutation -= (permunreg[1]*24);
-                                               permunreg[2] = permutation/6;
-                                               permutation -= (permunreg[2]*6);
-                                               permunreg[3] = permutation/2;
-                                               permutation -= (permunreg[3]*2);
-                                               permunreg[4] = permutation;
-                                               break;
-                                       case 4:
-                                               permunreg[0] = permutation/60;
-                                               permutation -= (permunreg[0]*60);
-                                               permunreg[1] = permutation/12;
-                                               permutation -= (permunreg[1]*12);
-                                               permunreg[2] = permutation/3;
-                                               permutation -= (permunreg[2]*3);
-                                               permunreg[3] = permutation;
-                                               break;
-                                       case 3:
-                                               permunreg[0] = permutation/20;
-                                               permutation -= (permunreg[0]*20);
-                                               permunreg[1] = permutation/4;
-                                               permutation -= (permunreg[1]*4);
-                                               permunreg[2] = permutation;
-                                               break;
-                                       case 2:
-                                               permunreg[0] = permutation/5;
-                                               permutation -= (permunreg[0]*5);
-                                               permunreg[1] = permutation;
-                                               break;
-                                       case 1:
-                                               permunreg[0] = permutation;
-                                               break;
-                               }
-                               // renumber registers back to standard numbers
-                               int registers[6];
-                               bool used[7] = { false, false, false, false, false, false, false };
-                               for (int i=0; i < regCount; ++i) {
-                                       int renum = 0; 
-                                       for (int u=1; u < 7; ++u) {
-                                               if ( !used[u] ) {
-                                                       if ( renum == permunreg[i] ) {
-                                                               registers[i] = u;
-                                                               used[u] = true;
-                                                               break;
-                                                       }
-                                                       ++renum;
-                                               }
-                                       }
-                               }
-                               bool needComma = false;
-                               for (int i=0; i < regCount; ++i) {
-                                       if ( needComma ) 
-                                               strcat(str, ",");
-                                       else
-                                               needComma = true;
-                                       switch ( registers[i] ) {
-                                               case UNWIND_X86_REG_EBX:
-                                                       strcat(str, "ebx");
-                                                       break;
-                                               case UNWIND_X86_REG_ECX:
-                                                       strcat(str, "ecx");
-                                                       break;
-                                               case UNWIND_X86_REG_EDX:
-                                                       strcat(str, "edx");
-                                                       break;
-                                               case UNWIND_X86_REG_EDI:
-                                                       strcat(str, "edi");
-                                                       break;
-                                               case UNWIND_X86_REG_ESI:
-                                                       strcat(str, "esi");
-                                                       break;
-                                               case UNWIND_X86_REG_EBP:
-                                                       strcat(str, "ebp");
-                                                       break;
-                                               default:
-                                                       strcat(str, "e??");
-                                       }
-                               }
-                       }
-               }
-               break;
-               case UNWIND_X86_MODE_DWARF:
-                       sprintf(str, "dwarf offset 0x%08X, ", encoding & UNWIND_X86_DWARF_SECTION_OFFSET);
-                       break;
-               default:
-                       if ( encoding == 0 )
-                               strcat(str, "no unwind information");
-                       else
-                               strcat(str, "tbd ");
-       }
-       if ( encoding & UNWIND_HAS_LSDA ) {
-               strcat(str, " LSDA");
-       }
-
-}
-
-
-template <typename A>
-void UnwindPrinter<A>::decode(uint32_t encoding, const uint8_t* funcStart, char* str)
-{
-       
-
-}
 
 template <typename A>
 void UnwindPrinter<A>::printUnwindSection()
 
 template <typename A>
 void UnwindPrinter<A>::printUnwindSection()
@@ -681,7 +309,7 @@ void UnwindPrinter<A>::printUnwindSection()
        printf("\tcommon encodings: (count=%u)\n", sectionHeader->commonEncodingsArrayCount());
        const uint32_t* commonEncodings = (uint32_t*)&sectionContent[sectionHeader->commonEncodingsArraySectionOffset()];
        for (uint32_t i=0; i < sectionHeader->commonEncodingsArrayCount(); ++i) {
        printf("\tcommon encodings: (count=%u)\n", sectionHeader->commonEncodingsArrayCount());
        const uint32_t* commonEncodings = (uint32_t*)&sectionContent[sectionHeader->commonEncodingsArraySectionOffset()];
        for (uint32_t i=0; i < sectionHeader->commonEncodingsArrayCount(); ++i) {
-               printf("\t\tencoding[%3u]=0x%08X\n", i, A::P::E::get32(commonEncodings[i]));
+               printf("\t\tencoding[%2u]=0x%08X\n", i, A::P::E::get32(commonEncodings[i]));
        }
        printf("\tpersonalities: (count=%u)\n", sectionHeader->personalityArrayCount());
        const uint32_t* personalityArray = (uint32_t*)&sectionContent[sectionHeader->personalityArraySectionOffset()];
        }
        printf("\tpersonalities: (count=%u)\n", sectionHeader->personalityArrayCount());
        const uint32_t* personalityArray = (uint32_t*)&sectionContent[sectionHeader->personalityArraySectionOffset()];
@@ -715,10 +343,10 @@ void UnwindPrinter<A>::printUnwindSection()
                        printf("\t\tentryCount=0x%08X\n", page->entryCount());
                        const macho_unwind_info_regular_second_level_entry<P>* entry = (macho_unwind_info_regular_second_level_entry<P>*)((char*)page+page->entryPageOffset());
                        for (uint32_t j=0; j < page->entryCount(); ++j) {
                        printf("\t\tentryCount=0x%08X\n", page->entryCount());
                        const macho_unwind_info_regular_second_level_entry<P>* entry = (macho_unwind_info_regular_second_level_entry<P>*)((char*)page+page->entryPageOffset());
                        for (uint32_t j=0; j < page->entryCount(); ++j) {
-                               uint32_t funcOffset = entry[j].functionOffset();
                                if ( entry[j].encoding() & UNWIND_HAS_LSDA ) {
                                        // verify there is a corresponding entry in lsda table
                                        bool found = false;
                                if ( entry[j].encoding() & UNWIND_HAS_LSDA ) {
                                        // verify there is a corresponding entry in lsda table
                                        bool found = false;
+                                       uint32_t funcOffset = entry[j].functionOffset();
                                        for (uint32_t k=0; k < lsdaIndexArrayCount; ++k) {
                                                if ( lindex[k].functionOffset() == funcOffset ) {
                                                        found = true;
                                        for (uint32_t k=0; k < lsdaIndexArrayCount; ++k) {
                                                if ( lindex[k].functionOffset() == funcOffset ) {
                                                        found = true;
@@ -729,10 +357,8 @@ void UnwindPrinter<A>::printUnwindSection()
                                                fprintf(stderr, "MISSING LSDA entry for %s\n", functionName(funcOffset+fMachHeaderAddress));
                                        }
                                } 
                                                fprintf(stderr, "MISSING LSDA entry for %s\n", functionName(funcOffset+fMachHeaderAddress));
                                        }
                                } 
-                               char encodingString[100];
-                               decode(entry[j].encoding(), ((const uint8_t*)fHeader)+funcOffset, encodingString);
-                               printf("\t\t\t[%3u] funcOffset=0x%08X, encoding=0x%08X (%-40s) %s\n", 
-                                       j, funcOffset, entry[j].encoding(), encodingString, functionName(funcOffset+fMachHeaderAddress));
+                               printf("\t\t\t[%3u] funcOffset=0x%08X, encoding=0x%08X  %s\n", 
+                                       j, entry[j].functionOffset(), entry[j].encoding(), functionName(entry[j].functionOffset()+fMachHeaderAddress));
                        }
                }
                else if ( page->kind() == UNWIND_SECOND_LEVEL_COMPRESSED ) {
                        }
                }
                else if ( page->kind() == UNWIND_SECOND_LEVEL_COMPRESSED ) {
@@ -752,9 +378,7 @@ void UnwindPrinter<A>::printUnwindSection()
                                        encoding =  A::P::E::get32(commonEncodings[encodingIndex]);
                                else
                                        encoding =  A::P::E::get32(encodings[encodingIndex-sectionHeader->commonEncodingsArrayCount()]);
                                        encoding =  A::P::E::get32(commonEncodings[encodingIndex]);
                                else
                                        encoding =  A::P::E::get32(encodings[encodingIndex-sectionHeader->commonEncodingsArrayCount()]);
-                               char encodingString[100];
                                uint32_t funcOff = UNWIND_INFO_COMPRESSED_ENTRY_FUNC_OFFSET(entries[j])+baseFunctionOffset;
                                uint32_t funcOff = UNWIND_INFO_COMPRESSED_ENTRY_FUNC_OFFSET(entries[j])+baseFunctionOffset;
-                               decode(encoding, ((const uint8_t*)fHeader)+funcOff, encodingString);
                                const char* name = functionName(funcOff+fMachHeaderAddress);
                                if ( encoding & UNWIND_HAS_LSDA ) {
                                        // verify there is a corresponding entry in lsda table
                                const char* name = functionName(funcOff+fMachHeaderAddress);
                                if ( encoding & UNWIND_HAS_LSDA ) {
                                        // verify there is a corresponding entry in lsda table
@@ -769,8 +393,8 @@ void UnwindPrinter<A>::printUnwindSection()
                                                fprintf(stderr, "MISSING LSDA entry for %s\n", name);
                                        }
                                } 
                                                fprintf(stderr, "MISSING LSDA entry for %s\n", name);
                                        }
                                } 
-                               printf("\t\t\t[%3u] funcOffset=0x%08X, encoding[%3u]=0x%08X (%-40s) %s\n", 
-                                       j, funcOff, encodingIndex, encoding, encodingString, name);
+                               printf("\t\t\t[%3u] funcOffset=0x%08X, encoding[%2u]=0x%08X   %s\n", 
+                                       j, funcOff, encodingIndex, encoding, name);
                        }                                       
                }
                else {
                        }                                       
                }
                else {
index fa969688a5b3fcbf370ca5545623234303b605cd..842ce77e079f159cdbf68b5bcf309e3229ac88a1 100755 (executable)
@@ -19,8 +19,6 @@ valid_archs="x86_64 armv6 ppc i386  "
 ../bin/make-recursive.pl clean > /dev/null
 
 mkdir /tmp/$$
 ../bin/make-recursive.pl clean > /dev/null
 
 mkdir /tmp/$$
-mkdir $BUILD_ROOT/lib
-ln -s /Developer/usr/lib/libLTO.dylib ${BUILD_ROOT}/lib/libLTO.dylib
 for arch in $all_archs
 do
        echo ""
 for arch in $all_archs
 do
        echo ""
diff --git a/unit-tests/test-cases/coalesce_weak_def_in_dylib/Makefile b/unit-tests/test-cases/coalesce_weak_def_in_dylib/Makefile
deleted file mode 100644 (file)
index 72f365b..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-##
-# Copyright (c) 2009 Apple Inc. All rights reserved.
-#
-# @APPLE_LICENSE_HEADER_START@
-#
-# This file contains Original Code and/or Modifications of Original Code
-# as defined in and that are subject to the Apple Public Source License
-# Version 2.0 (the 'License'). You may not use this file except in
-# compliance with the License. Please obtain a copy of the License at
-# http://www.opensource.apple.com/apsl/ and read it before using this
-# file.
-#
-# The Original Code and all software distributed under the License are
-# distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
-# EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
-# INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
-# Please see the License for the specific language governing rights and
-# limitations under the License.
-#
-# @APPLE_LICENSE_HEADER_END@
-##
-TESTROOT = ../..
-include ${TESTROOT}/include/common.makefile
-
-#
-# Test the if all symbols from a dylib are weak_import, that the whole dylib is weakly loaded
-#
-
-run: all-${ARCH}
-
-
-all-ppc:
-       ${PASS_IFF} true
-
-all-arm:
-       ${PASS_IFF} true
-       
-all-i386: all-real
-
-all-x86_64: all-real
-
-
-all-real:      
-       ${CC} ${CCFLAGS} -dynamiclib  foo.c -o libfoo.dylib 
-       ${FAIL_IF_BAD_MACHO} libfoo.dylib
-       
-       ${CC} ${CCFLAGS} main.c -o main libfoo.dylib 
-       dyldinfo -bind main | grep wfoo | ${FAIL_IF_EMPTY}
-       
-       ${PASS_IFF_GOOD_MACHO} main
-
-               
-clean:
-       rm -rf libfoo.dylib main
diff --git a/unit-tests/test-cases/coalesce_weak_def_in_dylib/foo.c b/unit-tests/test-cases/coalesce_weak_def_in_dylib/foo.c
deleted file mode 100644 (file)
index 1906d16..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
-__attribute__((weak)) void wfoo() {}
-void foo() {}
diff --git a/unit-tests/test-cases/coalesce_weak_def_in_dylib/main.c b/unit-tests/test-cases/coalesce_weak_def_in_dylib/main.c
deleted file mode 100644 (file)
index afd696d..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-
-extern void foo();
-extern void wfoo();
-
-void* pfoo = &foo;
-void* pwfoo = &wfoo;
-
-int main (void)
-{
-       if (pfoo != &foo)
-               return 1;
-       if (pwfoo != &wfoo)
-               return 1;
-
-   return 0;
-}
-
diff --git a/unit-tests/test-cases/cstring-alt-segment/Makefile b/unit-tests/test-cases/cstring-alt-segment/Makefile
deleted file mode 100644 (file)
index 4e55304..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-##
-# Copyright (c) 2009 Apple Inc. All rights reserved.
-#
-# @APPLE_LICENSE_HEADER_START@
-# 
-# This file contains Original Code and/or Modifications of Original Code
-# as defined in and that are subject to the Apple Public Source License
-# Version 2.0 (the 'License'). You may not use this file except in
-# compliance with the License. Please obtain a copy of the License at
-# http://www.opensource.apple.com/apsl/ and read it before using this
-# file.
-# 
-# The Original Code and all software distributed under the License are
-# distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
-# EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
-# INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
-# Please see the License for the specific language governing rights and
-# limitations under the License.
-# 
-# @APPLE_LICENSE_HEADER_END@
-##
-TESTROOT = ../..
-include ${TESTROOT}/include/common.makefile
-
-#
-# Check that __cstring sections in other segments are not coalesced
-#<rdar://problem/6535736> ld coalesces C strings in different segments
-#
-
-run: all
-
-all:
-       ${CC} ${CCFLAGS} main.c custom.s -o main 
-       size -l main | grep __cstring | wc -l | grep 2 | ${FAIL_IF_EMPTY}
-       ${PASS_IFF_GOOD_MACHO} main
-
-clean:
-       rm main
diff --git a/unit-tests/test-cases/cstring-alt-segment/custom.s b/unit-tests/test-cases/cstring-alt-segment/custom.s
deleted file mode 100644 (file)
index 33705e5..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-       .section __MYSEG, __cstring, cstring_literals
-LC:            .ascii  "hello"
-
-
-
diff --git a/unit-tests/test-cases/cstring-alt-segment/main.c b/unit-tests/test-cases/cstring-alt-segment/main.c
deleted file mode 100644 (file)
index 8fe18db..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-#include <stdio.h>
-
-int main()
-{
-       printf("hello");
-       return 0;
-}
index 0780b62e0fe8adda18d0328d5ab36056a5f2af7e..efed30681ad348925eb1ff187835dd4c8047bbf4 100644 (file)
@@ -1,6 +1,4 @@
 
 
-void func() {}
-
 const char kFoo[] = "foo";
 
 const char* kFoo2 = "hello";
 const char kFoo[] = "foo";
 
 const char* kFoo2 = "hello";
diff --git a/unit-tests/test-cases/dead_strip-r_symbol_desc/Makefile b/unit-tests/test-cases/dead_strip-r_symbol_desc/Makefile
deleted file mode 100644 (file)
index e60513e..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-##
-# Copyright (c) 2009 Apple Inc. All rights reserved.
-#
-# @APPLE_LICENSE_HEADER_START@
-# 
-# This file contains Original Code and/or Modifications of Original Code
-# as defined in and that are subject to the Apple Public Source License
-# Version 2.0 (the 'License'). You may not use this file except in
-# compliance with the License. Please obtain a copy of the License at
-# http://www.opensource.apple.com/apsl/ and read it before using this
-# file.
-# 
-# The Original Code and all software distributed under the License are
-# distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
-# EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
-# INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
-# Please see the License for the specific language governing rights and
-# limitations under the License.
-# 
-# @APPLE_LICENSE_HEADER_END@
-##
-TESTROOT = ../..
-include ${TESTROOT}/include/common.makefile
-
-#
-# Test that N_NO_DEAD_STRIP bit survives ld -r
-#
-
-run: all
-
-all:
-       ${CC} ${CCFLAGS} main.c -c -o main.o
-       nm -m main.o | grep _bar | grep "no dead strip" | ${FAIL_IF_EMPTY}
-       nm -m main.o | grep _foo | grep "no dead strip" | ${FAIL_IF_EMPTY}
-       ${LD} -r main.o -o main2.o
-       nm -m main2.o | grep _bar | grep "no dead strip" | ${FAIL_IF_EMPTY}
-       nm -m main2.o | grep _foo | grep "no dead strip" | ${FAIL_IF_EMPTY}
-       ${CC} main2.o -o main 
-       nm -m main | grep _bar | grep "no dead strip" | ${PASS_IFF_EMPTY}
-
-clean:
-       rm -rf main.o main2.o main
diff --git a/unit-tests/test-cases/dead_strip-r_symbol_desc/main.c b/unit-tests/test-cases/dead_strip-r_symbol_desc/main.c
deleted file mode 100644 (file)
index 7e206e5..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-/* -*- mode: C++; c-basic-offset: 4; tab-width: 4 -*- 
- *
- * Copyright (c) 2009 Apple Inc. All rights reserved.
- *
- * @APPLE_LICENSE_HEADER_START@
- * 
- * This file contains Original Code and/or Modifications of Original Code
- * as defined in and that are subject to the Apple Public Source License
- * Version 2.0 (the 'License'). You may not use this file except in
- * compliance with the License. Please obtain a copy of the License at
- * http://www.opensource.apple.com/apsl/ and read it before using this
- * file.
- * 
- * The Original Code and all software distributed under the License are
- * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
- * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
- * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
- * Please see the License for the specific language governing rights and
- * limitations under the License.
- * 
- * @APPLE_LICENSE_HEADER_END@
- */
-
-
-__attribute__((used))  static void foo()
-{
-}
-
-
-__attribute__((used))  void bar()
-{
-}
-
-
-int main()
-{
-       foo();
-       bar();
-       return 0;
-}
diff --git a/unit-tests/test-cases/dead_strip-weak-coalesce/Makefile b/unit-tests/test-cases/dead_strip-weak-coalesce/Makefile
deleted file mode 100644 (file)
index 45886c0..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-##
-# Copyright (c) 2009 Apple Inc. All rights reserved.
-#
-# @APPLE_LICENSE_HEADER_START@
-# 
-# This file contains Original Code and/or Modifications of Original Code
-# as defined in and that are subject to the Apple Public Source License
-# Version 2.0 (the 'License'). You may not use this file except in
-# compliance with the License. Please obtain a copy of the License at
-# http://www.opensource.apple.com/apsl/ and read it before using this
-# file.
-# 
-# The Original Code and all software distributed under the License are
-# distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
-# EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
-# INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
-# Please see the License for the specific language governing rights and
-# limitations under the License.
-# 
-# @APPLE_LICENSE_HEADER_END@
-##
-TESTROOT = ../..
-include ${TESTROOT}/include/common.makefile
-
-#
-# Check that symbols in no-dead-strip sections can be coalesced.
-# <rdar://problem/6578360> -dead_strip inhibits weak coalescing in no_dead_strip section
-#
-
-run: all
-
-all:
-       ${CC} ${CCFLAGS} baz.c -c -o baz.o
-       libtool -static baz.o -o libbaz.a
-       ${CC} ${CCFLAGS} main.c foo.c libbaz.a -dead_strip -o main
-       nm -j main | grep _hidden | wc -l | grep 1 | ${FAIL_IF_EMPTY}
-       ${PASS_IFF_GOOD_MACHO} main
-
-clean:
-       rm -rf main baz.o libbaz.a
diff --git a/unit-tests/test-cases/dead_strip-weak-coalesce/baz.c b/unit-tests/test-cases/dead_strip-weak-coalesce/baz.c
deleted file mode 100644 (file)
index 7d76bdd..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-void baz()
-{
-}
-
-
-#include "foo.c"
-
diff --git a/unit-tests/test-cases/dead_strip-weak-coalesce/foo.c b/unit-tests/test-cases/dead_strip-weak-coalesce/foo.c
deleted file mode 100644 (file)
index 4cd4cfb..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-
-// function can be coalesced and should not be dead stripped
-void __attribute__ ((weak, section ("__TEXT,__text_no_strip,regular,no_dead_strip"))) foo()
-{
-
-}
-
-
-// function should not be exported, can be coalesced, and should not be dead stripped
-void __attribute__ ((weak, visibility("hidden"), section ("__TEXT,__text_no_strip,regular,no_dead_strip"))) hidden()
-{
-
-}
-
-// bar should be dead stripped
-void __attribute__ ((weak, section ("__DATA,__text2"))) bar()
-{
-
-}
-
-__attribute__((constructor)) static void init() 
-{
-       foo();
-       hidden();
-}
diff --git a/unit-tests/test-cases/dead_strip-weak-coalesce/main.c b/unit-tests/test-cases/dead_strip-weak-coalesce/main.c
deleted file mode 100644 (file)
index e4c564c..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-
-// baz is in a lazily loaded archive
-extern void baz();
-
-int main()
-{
-       baz();
-       return 0;
-}
-
-
-#include "foo.c"
-
index 27cd1806b179e4d57edb90a7d8bbddd3bf869a25..8ce50d66ceeddda0bdf9d77b7cbc6bd42241a5f3 100644 (file)
@@ -43,7 +43,7 @@ all:
        ${LD} -r foo.no.o bar.no.o baz.no.o -o foobarbaz.no.o 
        ${OBJECTDUMP} -no_content -no_sort foobarbaz.o > foobarbaz.dump
        ${OBJECTDUMP} -no_content -no_sort foobarbaz.no.o > foobarbaz.no.dump
        ${LD} -r foo.no.o bar.no.o baz.no.o -o foobarbaz.no.o 
        ${OBJECTDUMP} -no_content -no_sort foobarbaz.o > foobarbaz.dump
        ${OBJECTDUMP} -no_content -no_sort foobarbaz.no.o > foobarbaz.no.dump
-       ${FAIL_IF_ERROR} dwarfdump --eh-frame --verify foobarbaz.no.o >/dev/null
+       ${FAIL_IF_ERROR} dwarfdump --eh-frame --verify >/dev/null
        ${PASS_IFF_SUCCESS} diff foobarbaz.dump foobarbaz.no.dump 
  
 
        ${PASS_IFF_SUCCESS} diff foobarbaz.dump foobarbaz.no.dump 
  
 
index 7e8c6e1e8057f713d422c1f9bd0dab167b7d37a9..bb679088c7af9d5ae867a6cf20b3bd6671e97a25 100644 (file)
@@ -33,8 +33,8 @@ include ${TESTROOT}/include/common.makefile
 run: all
 
 all:
 run: all
 
 all:
-       ${CXX} ${CXXFLAGS} main.cxx foo.cxx bar.cxx -o main -dead_strip
-       nm -s __TEXT __text -nj main | grep -v dyld_stub_binding_helper | c++filt  > actual-order.txt
+       ${CXX} ${CXXFLAGS} main.cxx foo.cxx bar.cxx -o main
+       nm -s __TEXT __text -nj main | c++filt  > actual-order.txt
        ${PASS_IFF} diff actual-order.txt expected-order.txt
        
 
        ${PASS_IFF} diff actual-order.txt expected-order.txt
        
 
index 9a303d341db2dffe3cffe466e83b35299893c373..1de60f3ab0e4a03688b221ab54e0cd9e3e8041db 100644 (file)
@@ -8,6 +8,8 @@ Bar::Bar()
 __static_initialization_and_destruction_0(int, int)
 global constructors keyed to b1
 start
 __static_initialization_and_destruction_0(int, int)
 global constructors keyed to b1
 start
+dyld_stub_binding_helper
+__dyld_func_lookup
 _main
 M::~M()
 Foo::~Foo()
 _main
 M::~M()
 Foo::~Foo()
index d233171a6b4087fee3e7d83c834f115b8ac4edac..6a318b343a2b2a5885a5bee1ae5582f2c005f260 100644 (file)
@@ -23,6 +23,7 @@ all:
        nm -nm mykext | grep '(undefined) external _extern_global' | ${FAIL_IF_EMPTY}
        nm -nm mykext | grep '(__DATA,__data) external _my_global' | ${FAIL_IF_EMPTY}
        otool -rv mykext | grep '_extern_global' | ${FAIL_IF_EMPTY}
        nm -nm mykext | grep '(undefined) external _extern_global' | ${FAIL_IF_EMPTY}
        nm -nm mykext | grep '(__DATA,__data) external _my_global' | ${FAIL_IF_EMPTY}
        otool -rv mykext | grep '_extern_global' | ${FAIL_IF_EMPTY}
+       otool -rv mykext | grep '_OSRuntimeFinalizeCPP' | ${FAIL_IF_EMPTY}
        ${PASS_IFF} true
 
 clean:
        ${PASS_IFF} true
 
 clean:
diff --git a/unit-tests/test-cases/label-on-end-of-section/Makefile b/unit-tests/test-cases/label-on-end-of-section/Makefile
new file mode 100644 (file)
index 0000000..a6f1537
--- /dev/null
@@ -0,0 +1,37 @@
+##
+# Copyright (c) 2009 Apple Inc. All rights reserved.
+#
+# @APPLE_LICENSE_HEADER_START@
+# 
+# This file contains Original Code and/or Modifications of Original Code
+# as defined in and that are subject to the Apple Public Source License
+# Version 2.0 (the 'License'). You may not use this file except in
+# compliance with the License. Please obtain a copy of the License at
+# http://www.opensource.apple.com/apsl/ and read it before using this
+# file.
+# 
+# The Original Code and all software distributed under the License are
+# distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+# EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+# INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
+# Please see the License for the specific language governing rights and
+# limitations under the License.
+# 
+# @APPLE_LICENSE_HEADER_END@
+##
+TESTROOT = ../..
+include ${TESTROOT}/include/common.makefile
+
+#
+# Check that ld handles labels at the end of a section
+#
+
+run: all
+
+all:
+       ${CC} ${CCFLAGS} foo.s -c -o foo.o
+       ${OBJECTDUMP} foo.o | grep "pointer to _end" | ${PASS_IFF_STDIN}
+
+clean:
+       rm  foo.o
diff --git a/unit-tests/test-cases/label-on-end-of-section/foo.s b/unit-tests/test-cases/label-on-end-of-section/foo.s
new file mode 100644 (file)
index 0000000..9544a76
--- /dev/null
@@ -0,0 +1,17 @@
+
+
+        .section __MY, __data
+_start:
+               .long 0
+_end:
+
+# _var is a pointer to the end of the __MY/__data section
+       .data
+_var:
+#if __x86_64__
+       .quad _end
+#else
+       .long _end
+#endif
+
+       .subsections_via_symbols
\ No newline at end of file
diff --git a/unit-tests/test-cases/no-data-bundle/Makefile b/unit-tests/test-cases/no-data-bundle/Makefile
deleted file mode 100644 (file)
index e1417fd..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-##
-# Copyright (c) 2009 Apple Inc. All rights reserved.
-#
-# @APPLE_LICENSE_HEADER_START@
-# 
-# This file contains Original Code and/or Modifications of Original Code
-# as defined in and that are subject to the Apple Public Source License
-# Version 2.0 (the 'License'). You may not use this file except in
-# compliance with the License. Please obtain a copy of the License at
-# http://www.opensource.apple.com/apsl/ and read it before using this
-# file.
-# 
-# The Original Code and all software distributed under the License are
-# distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
-# EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
-# INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
-# Please see the License for the specific language governing rights and
-# limitations under the License.
-# 
-# @APPLE_LICENSE_HEADER_END@
-##
-TESTROOT = ../..
-include ${TESTROOT}/include/common.makefile
-
-#
-# Check that a bundle built with no data links
-# <rdar://problem/6532377> gcc DejaGnu failure: building longcall/dylib library
-#
-
-run: all
-
-all:
-       ${CC} ${CCFLAGS} foo.c -bundle -o foo.bundle
-       ${PASS_IFF_GOOD_MACHO} foo.bundle
-
-clean:
-       rm foo.bundle
diff --git a/unit-tests/test-cases/no-data-bundle/foo.c b/unit-tests/test-cases/no-data-bundle/foo.c
deleted file mode 100644 (file)
index 5cb3e31..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-#include <stdlib.h>
-
-void foo()
-{
-       rand();
-}
\ No newline at end of file
diff --git a/unit-tests/test-cases/no_zero_fill_sections/Makefile b/unit-tests/test-cases/no_zero_fill_sections/Makefile
new file mode 100644 (file)
index 0000000..8db13a7
--- /dev/null
@@ -0,0 +1,39 @@
+##
+# Copyright (c) 2005 Apple Computer, Inc. All rights reserved.
+#
+# @APPLE_LICENSE_HEADER_START@
+# 
+# This file contains Original Code and/or Modifications of Original Code
+# as defined in and that are subject to the Apple Public Source License
+# Version 2.0 (the 'License'). You may not use this file except in
+# compliance with the License. Please obtain a copy of the License at
+# http://www.opensource.apple.com/apsl/ and read it before using this
+# file.
+# 
+# The Original Code and all software distributed under the License are
+# distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+# EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+# INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
+# Please see the License for the specific language governing rights and
+# limitations under the License.
+# 
+# @APPLE_LICENSE_HEADER_END@
+##
+TESTROOT = ../..
+include ${TESTROOT}/include/common.makefile
+
+#
+# Check that the -no_zero_fill_sections works
+#
+
+run: all
+
+all:
+       ${CC} ${CCFLAGS} main.c -o main -Wl,-no_zero_fill_sections 
+       size -l main | grep __bss | grep "offset 0" | ${FAIL_IF_STDIN}
+       size -l main | grep __common | grep "offset 0" | ${FAIL_IF_STDIN}
+       ${PASS_IFF_GOOD_MACHO} main
+
+clean:
+       rm  main
diff --git a/unit-tests/test-cases/no_zero_fill_sections/main.c b/unit-tests/test-cases/no_zero_fill_sections/main.c
new file mode 100644 (file)
index 0000000..a04a2ca
--- /dev/null
@@ -0,0 +1,34 @@
+/* -*- mode: C++; c-basic-offset: 4; tab-width: 4 -*- 
+ *
+ * Copyright (c) 2009 Apple Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * This file contains Original Code and/or Modifications of Original Code
+ * as defined in and that are subject to the Apple Public Source License
+ * Version 2.0 (the 'License'). You may not use this file except in
+ * compliance with the License. Please obtain a copy of the License at
+ * http://www.opensource.apple.com/apsl/ and read it before using this
+ * file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
+ * Please see the License for the specific language governing rights and
+ * limitations under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include <stdio.h>
+
+static int a[2000];
+int b[2000];
+
+int main()
+{
+       a[0] = 0;
+       b[0] = 0;
+       return 0;
+}
\ No newline at end of file
diff --git a/unit-tests/test-cases/objc-literal-pointers-strip/Makefile b/unit-tests/test-cases/objc-literal-pointers-strip/Makefile
deleted file mode 100644 (file)
index 76a7347..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-##
-# Copyright (c) 2009 Apple Inc. All rights reserved.
-#
-# @APPLE_LICENSE_HEADER_START@
-# 
-# This file contains Original Code and/or Modifications of Original Code
-# as defined in and that are subject to the Apple Public Source License
-# Version 2.0 (the 'License'). You may not use this file except in
-# compliance with the License. Please obtain a copy of the License at
-# http://www.opensource.apple.com/apsl/ and read it before using this
-# file.
-# 
-# The Original Code and all software distributed under the License are
-# distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
-# EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
-# INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
-# Please see the License for the specific language governing rights and
-# limitations under the License.
-# 
-# @APPLE_LICENSE_HEADER_END@
-##
-TESTROOT = ../..
-include ${TESTROOT}/include/common.makefile
-
-
-#
-# Verify an Objective-C object file when run through
-# ld -r -x 
-#   <rdar://problem/6605499> x86_64 obj-c runtime confused when static lib is stripped
-#
-#
-
-SELECTOR_REFS = "__OBJC,__message_refs"
-
-ifeq ($(ARCH),x86_64)
-       SELECTOR_REFS = "__DATA,__objc_selrefs"
-endif
-ifeq ($(ARCH),armv6)
-       SELECTOR_REFS = "__DATA,__objc_selrefs"
-endif
-
-
-
-run: all
-
-all:
-       ${CC} ${CCFLAGS} test.m -c -o test.o
-       ${OBJECTDUMP}  -no_content test.o | grep -B3 -A6 ${SELECTOR_REFS} > test.dump
-
-       ${LD} -arch ${ARCH} -r test.o -x -o test-r.o
-       ${OBJECTDUMP}  -no_content test-r.o | grep -B3 -A6 ${SELECTOR_REFS}  > test-r.dump
-
-       diff test.dump test-r.dump | ${PASS_IFF_EMPTY}
-       
-clean:
-       rm -rf test.o test.dump test-r.o test-r.dump
diff --git a/unit-tests/test-cases/objc-literal-pointers-strip/test.m b/unit-tests/test-cases/objc-literal-pointers-strip/test.m
deleted file mode 100644 (file)
index 4837911..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-/* -*- mode: C++; c-basic-offset: 4; tab-width: 4 -*- 
- *
- * Copyright (c) 2009 Apple Inc. All rights reserved.
- *
- * @APPLE_LICENSE_HEADER_START@
- * 
- * This file contains Original Code and/or Modifications of Original Code
- * as defined in and that are subject to the Apple Public Source License
- * Version 2.0 (the 'License'). You may not use this file except in
- * compliance with the License. Please obtain a copy of the License at
- * http://www.opensource.apple.com/apsl/ and read it before using this
- * file.
- * 
- * The Original Code and all software distributed under the License are
- * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
- * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
- * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
- * Please see the License for the specific language governing rights and
- * limitations under the License.
- * 
- * @APPLE_LICENSE_HEADER_END@
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-
-@interface Foo @end
-@implementation Foo
-+(void)initialize { }
-+(void)foo {
-    fprintf(stderr, "GOOD\n");
-    exit(0);
-}
-+(void)bar {
-    fprintf(stderr, "BAD\n");
-    abort();
-}
-@end
-
-void PublicFunction(void)
-{
-    [Foo foo];
-    [Foo bar];
-}
index 447ee8740b7e90312aba0f812e172c7a0454590d..8abf3e145ad2ec296dc670dccae9868c7db67c0c 100644 (file)
@@ -1,5 +1,5 @@
 ##
 ##
-# Copyright (c) 2006-2009 Apple Inc. All rights reserved.
+# Copyright (c) 2006-2007 Apple Inc. All rights reserved.
 #
 # @APPLE_LICENSE_HEADER_START@
 # 
 #
 # @APPLE_LICENSE_HEADER_START@
 # 
@@ -30,9 +30,6 @@ all:
        # verify if operator new is overridden that WEAK_DEFINES is set
        ${CXX} ${CXXFLAGS} -DOP_NEW -I${TESTROOT}/include -o main main.cxx
        otool -hv main | grep WEAK_DEFINES | ${FAIL_IF_EMPTY}
        # verify if operator new is overridden that WEAK_DEFINES is set
        ${CXX} ${CXXFLAGS} -DOP_NEW -I${TESTROOT}/include -o main main.cxx
        otool -hv main | grep WEAK_DEFINES | ${FAIL_IF_EMPTY}
-       # verify if operator new is overridden but not exported, WEAK_DEFINES is not set
-       ${CXX} ${CXXFLAGS} -DOP_NEW -I${TESTROOT}/include -o main main.cxx -Wl,-exported_symbol,_main
-       otool -hv main | grep WEAK_DEFINES | ${FAIL_IF_STDIN}
        # verify if operator new is not overridden that WEAK_DEFINES is not set
        ${CXX} ${CXXFLAGS} -I${TESTROOT}/include -o main main.cxx
        otool -hv main | grep WEAK_DEFINES | ${PASS_IFF_EMPTY}
        # verify if operator new is not overridden that WEAK_DEFINES is not set
        ${CXX} ${CXXFLAGS} -I${TESTROOT}/include -o main main.cxx
        otool -hv main | grep WEAK_DEFINES | ${PASS_IFF_EMPTY}
index b5d32729faef55b51a2a4337472814fe6eea64c0..3c99e358b861876cb564f079b60037474e4a7bc8 100644 (file)
@@ -36,7 +36,7 @@
 #if OP_NEW
 void* operator new(size_t s) throw (std::bad_alloc)
 {
 #if OP_NEW
 void* operator new(size_t s) throw (std::bad_alloc)
 {
-  return malloc(s);
+  return malloc(s);;
 }
 #endif
 
 }
 #endif
 
diff --git a/unit-tests/test-cases/re-export-optimizations-indirect/Makefile b/unit-tests/test-cases/re-export-optimizations-indirect/Makefile
deleted file mode 100644 (file)
index fdb13d5..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-##
-# Copyright (c) 2009 Apple Inc. All rights reserved.
-#
-# @APPLE_LICENSE_HEADER_START@
-#
-# This file contains Original Code and/or Modifications of Original Code
-# as defined in and that are subject to the Apple Public Source License
-# Version 2.0 (the 'License'). You may not use this file except in
-# compliance with the License. Please obtain a copy of the License at
-# http://www.opensource.apple.com/apsl/ and read it before using this
-# file.
-#
-# The Original Code and all software distributed under the License are
-# distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
-# EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
-# INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
-# Please see the License for the specific language governing rights and
-# limitations under the License.
-#
-# @APPLE_LICENSE_HEADER_END@
-##
-TESTROOT = ../..
-include ${TESTROOT}/include/common.makefile
-
-#
-# Test that a public re-exported library is automatically added as a dependent
-# unless nothing is used from it.
-#
-
-
-run: all
-
-all:
-       
-# -sub_library for 10.4
-       ${CC} ${CCFLAGS} -dynamiclib bar.c -o libbar.dylib  -install_name /usr/lib/libbar.dylib -mmacosx-version-min=10.4
-       ${FAIL_IF_BAD_MACHO} libbar.dylib
-       ${CC} ${CCFLAGS} -dynamiclib middle.c -o libmiddle.dylib -lbar -L. -sub_library libbar -install_name /mid/libmiddle.dylib -mmacosx-version-min=10.4
-       ${FAIL_IF_BAD_MACHO} libmiddle.dylib
-       ${CC} ${CCFLAGS} -dynamiclib foo.c -o libfoo.dylib -lmiddle -L. -sub_library libmiddle -install_name /usr/lib/libfoo.dylib -mmacosx-version-min=10.4
-       ${FAIL_IF_BAD_MACHO} libfoo.dylib
-       ${CC} ${CCFLAGS} -dynamiclib other.c -o libother.dylib -lbar -L. -sub_library libbar -install_name /usr/lib/libother.dylib -mmacosx-version-min=10.4
-       ${FAIL_IF_BAD_MACHO} libother.dylib
-       ${CC} ${CCFLAGS} main.c -DCALL_BAR libfoo.dylib libother.dylib -o main -L. -mmacosx-version-min=10.4
-       nm -m main | grep _bar | grep libbar | ${FAIL_IF_EMPTY}
-       ${PASS_IFF_GOOD_MACHO} main
-               
-# -sub_library for 10.5
-       ${CC} ${CCFLAGS} -dynamiclib bar.c -o libbar.dylib  -install_name /usr/lib/libbar.dylib -mmacosx-version-min=10.5
-       ${FAIL_IF_BAD_MACHO} libbar.dylib
-       ${CC} ${CCFLAGS} -dynamiclib middle.c -o libmiddle.dylib -lbar -L. -sub_library libbar -install_name /mid/libmiddle.dylib -mmacosx-version-min=10.5
-       ${FAIL_IF_BAD_MACHO} libmiddle.dylib
-       ${CC} ${CCFLAGS} -dynamiclib foo.c -o libfoo.dylib -lmiddle -L. -sub_library libmiddle -install_name /usr/lib/libfoo.dylib -mmacosx-version-min=10.5
-       ${FAIL_IF_BAD_MACHO} libfoo.dylib
-       ${CC} ${CCFLAGS} -dynamiclib other.c -o libother.dylib -lbar -L. -sub_library libbar -install_name /usr/lib/libother.dylib -mmacosx-version-min=10.5
-       ${FAIL_IF_BAD_MACHO} libother.dylib
-       ${CC} ${CCFLAGS} main.c -DCALL_BAR libfoo.dylib libother.dylib -o main -L. -mmacosx-version-min=10.5
-       nm -m main | grep _bar | grep libbar | ${FAIL_IF_EMPTY}
-       ${PASS_IFF_GOOD_MACHO} main
-       
-
-clean:
-       rm -rf libbar.dylib libfoo.dylib libmiddle.dylib libother.dylib main 
diff --git a/unit-tests/test-cases/re-export-optimizations-indirect/bar.c b/unit-tests/test-cases/re-export-optimizations-indirect/bar.c
deleted file mode 100644 (file)
index 9c18401..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-
-int bar (void)
-{
-       return 1;
-}
diff --git a/unit-tests/test-cases/re-export-optimizations-indirect/foo.c b/unit-tests/test-cases/re-export-optimizations-indirect/foo.c
deleted file mode 100644 (file)
index d0cdf47..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-int foo (void)
-{
-  return 1;
-}
diff --git a/unit-tests/test-cases/re-export-optimizations-indirect/main.c b/unit-tests/test-cases/re-export-optimizations-indirect/main.c
deleted file mode 100644 (file)
index 672ef9a..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-
-extern void bar();
-
-int main()
-{
-       bar();
-       return 0;
-}
diff --git a/unit-tests/test-cases/re-export-optimizations-indirect/middle.c b/unit-tests/test-cases/re-export-optimizations-indirect/middle.c
deleted file mode 100644 (file)
index d3578a6..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-
-void middle() {}
-
diff --git a/unit-tests/test-cases/re-export-optimizations-indirect/other.c b/unit-tests/test-cases/re-export-optimizations-indirect/other.c
deleted file mode 100644 (file)
index 0cd6dda..0000000
+++ /dev/null
@@ -1 +0,0 @@
-void other() {}
diff --git a/unit-tests/test-cases/relocs-neg-from-local/Makefile b/unit-tests/test-cases/relocs-neg-from-local/Makefile
deleted file mode 100644 (file)
index 36fb47b..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-##
-# Copyright (c) 2009 Apple Inc. All rights reserved.
-#
-# @APPLE_LICENSE_HEADER_START@
-# 
-# This file contains Original Code and/or Modifications of Original Code
-# as defined in and that are subject to the Apple Public Source License
-# Version 2.0 (the 'License'). You may not use this file except in
-# compliance with the License. Please obtain a copy of the License at
-# http://www.opensource.apple.com/apsl/ and read it before using this
-# file.
-# 
-# The Original Code and all software distributed under the License are
-# distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
-# EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
-# INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
-# Please see the License for the specific language governing rights and
-# limitations under the License.
-# 
-# @APPLE_LICENSE_HEADER_END@
-##
-TESTROOT = ../..
-include ${TESTROOT}/include/common.makefile
-
-#
-# <rdar://problem/6583757> i386 relocation error with negative offsets from local labels
-#
-
-ifeq (${ARCH},i386)
-       TARGET =  run-i386
-else 
-       TARGET =  run-other
-endif
-
-run: ${TARGET}
-
-run-other:
-       ${PASS_IFF} /usr/bin/true
-       
-
-run-i386:
-       ${CC} ${ASMFLAGS} test.s -c -o test.o
-       ${OBJECTDUMP} test.o | grep "__data@0 plus 0xFFFFFFE2" | ${FAIL_IF_EMPTY}
-
-       ${LD} -arch ${ARCH} -r -keep_private_externs test.o -o test-r.o
-       ${OBJECTDUMP} test-r.o | grep "__data@0 plus 0xFFFFFFE2" | ${PASS_IFF_STDIN}
-
-       
-clean:
-       rm -rf *.o
diff --git a/unit-tests/test-cases/relocs-neg-from-local/test.s b/unit-tests/test-cases/relocs-neg-from-local/test.s
deleted file mode 100644 (file)
index 3890f35..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright (c) 2009 Apple Inc. All rights reserved.
- *
- * @APPLE_LICENSE_HEADER_START@
- * 
- * This file contains Original Code and/or Modifications of Original Code
- * as defined in and that are subject to the Apple Public Source License
- * Version 2.0 (the 'License'). You may not use this file except in
- * compliance with the License. Please obtain a copy of the License at
- * http://www.opensource.apple.com/apsl/ and read it before using this
- * file.
- * 
- * The Original Code and all software distributed under the License are
- * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
- * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
- * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
- * Please see the License for the specific language governing rights and
- * limitations under the License.
- * 
- * @APPLE_LICENSE_HEADER_END@
- */
-
-               
-
-#if __i386__
-       .text
-       .align 2
-       
-_negative_offset_from_local_label:
-       nop
-       .space 100
-       movl      -80+L3(,%eax,4), %edx
-       ret
-       
-       .data
-L2:    .space  50
-L3:    .space  50
-_d:    .long   0
-
-#endif
-
-
diff --git a/unit-tests/test-cases/section-labels/Makefile b/unit-tests/test-cases/section-labels/Makefile
new file mode 100644 (file)
index 0000000..d783b16
--- /dev/null
@@ -0,0 +1,37 @@
+##
+# Copyright (c) 2009 Apple Inc. All rights reserved.
+#
+# @APPLE_LICENSE_HEADER_START@
+# 
+# This file contains Original Code and/or Modifications of Original Code
+# as defined in and that are subject to the Apple Public Source License
+# Version 2.0 (the 'License'). You may not use this file except in
+# compliance with the License. Please obtain a copy of the License at
+# http://www.opensource.apple.com/apsl/ and read it before using this
+# file.
+# 
+# The Original Code and all software distributed under the License are
+# distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+# EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+# INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
+# Please see the License for the specific language governing rights and
+# limitations under the License.
+# 
+# @APPLE_LICENSE_HEADER_END@
+##
+TESTROOT = ../..
+include ${TESTROOT}/include/common.makefile
+
+#
+# Check that ld resolves the magic section start/end symbols.
+#
+
+run: all
+
+all:
+       ${CC} ${CCFLAGS} main.c -o main
+       ${PASS_IFF_GOOD_MACHO} main
+
+clean:
+       rm  main
diff --git a/unit-tests/test-cases/section-labels/main.c b/unit-tests/test-cases/section-labels/main.c
new file mode 100644 (file)
index 0000000..a8c4bfa
--- /dev/null
@@ -0,0 +1,42 @@
+/* -*- mode: C++; c-basic-offset: 4; tab-width: 4 -*- 
+ *
+ * Copyright (c) 2009 Apple Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * This file contains Original Code and/or Modifications of Original Code
+ * as defined in and that are subject to the Apple Public Source License
+ * Version 2.0 (the 'License'). You may not use this file except in
+ * compliance with the License. Please obtain a copy of the License at
+ * http://www.opensource.apple.com/apsl/ and read it before using this
+ * file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
+ * Please see the License for the specific language governing rights and
+ * limitations under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+#include <stdio.h>
+
+struct stuff { int a; int b; };
+
+struct stuff stuff1 __attribute__ ((section ("__DATA,__my"))) = { 1, 2};
+struct stuff stuff2 __attribute__ ((section ("__DATA,__my"))) = { 3 ,4 };
+
+extern struct stuff*  stuff_start  __asm("section$start$__DATA$__my");
+extern struct stuff*  stuff_end    __asm("section$end$__DATA$__my");
+
+
+int main()
+{
+       struct stuff* p;
+       for (p = stuff_start; p < stuff_end; ++p) {
+               p->a = 0;
+       }
+       return 0;
+}
\ No newline at end of file
diff --git a/unit-tests/test-cases/section-names-long/Makefile b/unit-tests/test-cases/section-names-long/Makefile
deleted file mode 100644 (file)
index f31d9d6..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-##
-# Copyright (c) 2009 Apple Inc. All rights reserved.
-#
-# @APPLE_LICENSE_HEADER_START@
-#
-# This file contains Original Code and/or Modifications of Original Code
-# as defined in and that are subject to the Apple Public Source License
-# Version 2.0 (the 'License'). You may not use this file except in
-# compliance with the License. Please obtain a copy of the License at
-# http://www.opensource.apple.com/apsl/ and read it before using this
-# file.
-#
-# The Original Code and all software distributed under the License are
-# distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
-# EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
-# INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
-# Please see the License for the specific language governing rights and
-# limitations under the License.
-#
-# @APPLE_LICENSE_HEADER_END@
-##
-TESTROOT = ../..
-include ${TESTROOT}/include/common.makefile
-
-#
-# Validate long section names are preserved
-# <rdar://problem/6805002> corrupt metaclass entry in dynamic library
-#
-
-all:
-       ${CC} ${CCFLAGS} main.c a.s c.s b.s -o main
-       nm -m main | grep __aaaaaaaaaaaaaa | grep __TEXT | grep _at | ${FAIL_IF_EMPTY}
-       nm -m main | grep __bbbbbbbbbbbbbb | grep __TEXT | grep _bt | ${FAIL_IF_EMPTY}
-       nm -m main | grep __cccccccccccccc | grep __TEXT | grep _ct | ${FAIL_IF_EMPTY}
-       nm -m main | grep __aaaaaaaaaaaaaa | grep __DATA | grep _ad | ${FAIL_IF_EMPTY}
-       nm -m main | grep __bbbbbbbbbbbbbb | grep __DATA | grep _bd | ${FAIL_IF_EMPTY}
-       nm -m main | grep __cccccccccccccc | grep __DATA | grep _cd | ${FAIL_IF_EMPTY}
-       ${PASS_IFF_GOOD_MACHO} main
-       
-clean:
-       rm -rf main 
diff --git a/unit-tests/test-cases/section-names-long/a.s b/unit-tests/test-cases/section-names-long/a.s
deleted file mode 100644 (file)
index d7e5847..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-
-               .section __TEXT,__aaaaaaaaaaaaaa
-_at:   .space  128
-
-               .section __DATA,__aaaaaaaaaaaaaa
-_ad:   .space  128
-
-
-
diff --git a/unit-tests/test-cases/section-names-long/b.s b/unit-tests/test-cases/section-names-long/b.s
deleted file mode 100644 (file)
index a31d414..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-
-               .section __TEXT,__bbbbbbbbbbbbbb
-_bt:   .space  128
-
-               .section __DATA,__bbbbbbbbbbbbbb
-_bd:   .space  128
-
-
-
diff --git a/unit-tests/test-cases/section-names-long/c.s b/unit-tests/test-cases/section-names-long/c.s
deleted file mode 100644 (file)
index 383b159..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-
-               .section __TEXT,__cccccccccccccc
-_ct:   .space  128
-
-
-               .section __DATA,__cccccccccccccc
-_cd:   .space  128
-
-
-
-
diff --git a/unit-tests/test-cases/section-names-long/main.c b/unit-tests/test-cases/section-names-long/main.c
deleted file mode 100644 (file)
index df77448..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
-int main() { return 0; }
-
diff --git a/unit-tests/test-cases/shared-cache-dylib/Makefile b/unit-tests/test-cases/shared-cache-dylib/Makefile
deleted file mode 100644 (file)
index cd6dc04..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-##
-# Copyright (c) 2009 Apple Inc. All rights reserved.
-#
-# @APPLE_LICENSE_HEADER_START@
-# 
-# This file contains Original Code and/or Modifications of Original Code
-# as defined in and that are subject to the Apple Public Source License
-# Version 2.0 (the 'License'). You may not use this file except in
-# compliance with the License. Please obtain a copy of the License at
-# http://www.opensource.apple.com/apsl/ and read it before using this
-# file.
-# 
-# The Original Code and all software distributed under the License are
-# distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
-# EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
-# INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
-# Please see the License for the specific language governing rights and
-# limitations under the License.
-# 
-# @APPLE_LICENSE_HEADER_END@
-##
-TESTROOT = ../..
-include ${TESTROOT}/include/common.makefile
-
-#
-# Verify only dylibs with install paths in /System/Library or /usr/lib
-# get LC_SEGMENT_SPLIT_INFO
-#
-
-
-run: all
-
-all:
-       ${CC} ${CCFLAGS} foo.c -dynamiclib -o libfoo.dylib -install_name /usr/lib/libfoo.dylib
-       otool -lv libfoo.dylib | grep LC_SEGMENT_SPLIT_INFO | ${FAIL_IF_EMPTY}
-       ${CC} ${CCFLAGS} foo.c -dynamiclib -o libfoo.dylib -install_name /System/Library/Frameworks/Foo.framework/Foo
-       otool -lv libfoo.dylib | grep LC_SEGMENT_SPLIT_INFO | ${FAIL_IF_EMPTY}
-       ${CC} ${CCFLAGS} foo.c -dynamiclib -o libfoo.dylib -install_name /usr/local/lib/libfoo.dylib
-       otool -lv libfoo.dylib | grep LC_SEGMENT_SPLIT_INFO | ${FAIL_IF_STDIN}
-       ${CC} ${CCFLAGS} foo.c -dynamiclib -o libfoo.dylib 
-       otool -lv libfoo.dylib | grep LC_SEGMENT_SPLIT_INFO | ${FAIL_IF_STDIN}
-       ${PASS_IFF_GOOD_MACHO} libfoo.dylib 
-
-clean:
-       rm libfoo.dylib
diff --git a/unit-tests/test-cases/shared-cache-dylib/foo.c b/unit-tests/test-cases/shared-cache-dylib/foo.c
deleted file mode 100644 (file)
index 6924ac6..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-
-void foo() {}
-
index fcb7e7d0f87d8caa12c68f7acf5a6b75f241b35b..c0647b36c85f3e1407c2c6ea58197bdab3c8407f 100644 (file)
@@ -1,5 +1,5 @@
 ##
 ##
-# Copyright (c) 2007-2009 Apple Inc. All rights reserved.
+# Copyright (c) 2007 Apple Inc. All rights reserved.
 #
 # @APPLE_LICENSE_HEADER_START@
 # 
 #
 # @APPLE_LICENSE_HEADER_START@
 # 
 TESTROOT = ../..
 include ${TESTROOT}/include/common.makefile
 
 TESTROOT = ../..
 include ${TESTROOT}/include/common.makefile
 
-POINTER_SEGMENT = __DATA
-POINTER_SECTION  = __nl_symbol_ptr
+ifeq "${ARCH}"  "i386"
+       POINTER_SEGMENT = __IMPORT
+       POINTER_SECTION  = __pointers
+else
+       POINTER_SEGMENT = __DATA
+       POINTER_SECTION  = __nl_symbol_ptr
+endif
 
 
 #
 # Test that using strip -R to selectively strip symbol names
 # of of a .o file still works with ld.
 
 
 #
 # Test that using strip -R to selectively strip symbol names
 # of of a .o file still works with ld.
-# And for i386 that there are no __IMPORT/__pointers left <rdar://problem/6666004>
 #
 
 run: all
 #
 
 run: all
@@ -47,8 +51,6 @@ all:
        ${CC} ${CCFLAGS} all.o  -dynamiclib -o dylib2   
        otool -X -s ${POINTER_SEGMENT} ${POINTER_SECTION} dylib1 >dylib1.pointers
        otool -X -s ${POINTER_SEGMENT} ${POINTER_SECTION} dylib2 >dylib2.pointers
        ${CC} ${CCFLAGS} all.o  -dynamiclib -o dylib2   
        otool -X -s ${POINTER_SEGMENT} ${POINTER_SECTION} dylib1 >dylib1.pointers
        otool -X -s ${POINTER_SEGMENT} ${POINTER_SECTION} dylib2 >dylib2.pointers
-       size -l dylib1 | grep __IMPORT | ${FAIL_IF_STDIN}
-       size -l dylib2 | grep __IMPORT | ${FAIL_IF_STDIN}
        ${PASS_IFF} diff dylib1.pointers dylib2.pointers
 
 clean:
        ${PASS_IFF} diff dylib1.pointers dylib2.pointers
 
 clean:
index cdacfc968678248dcf702c8f0a3fd1ef449b3fcd..d1fa1f3f9f0ba737cb9d6f11acaff057df039fa2 100644 (file)
@@ -34,7 +34,7 @@ all:
        ${CC} ${CCFLAGS} -dynamiclib -single_module foo.c -o libfoo-${ARCH}.dylib 
        ${FAIL_IF_BAD_MACHO} libfoo-${ARCH}.dylib
 
        ${CC} ${CCFLAGS} -dynamiclib -single_module foo.c -o libfoo-${ARCH}.dylib 
        ${FAIL_IF_BAD_MACHO} libfoo-${ARCH}.dylib
 
-       ${CC} ${CCFLAGS} main.c -o main-${ARCH} libfoo-${ARCH}.dylib 
+       ${CC} ${CCFLAGS} -mmacosx-version-min=10.4 main.c -o main-${ARCH} libfoo-${ARCH}.dylib 
        nm -m main-${ARCH} | grep _func1 | grep -v weak    >/dev/null
        nm -m main-${ARCH} | grep _func2 | grep    weak    >/dev/null
        nm -m main-${ARCH} | grep _func3 | grep -v weak    >/dev/null 
        nm -m main-${ARCH} | grep _func1 | grep -v weak    >/dev/null
        nm -m main-${ARCH} | grep _func2 | grep    weak    >/dev/null
        nm -m main-${ARCH} | grep _func3 | grep -v weak    >/dev/null 
@@ -43,12 +43,10 @@ all:
        nm -m main-${ARCH} | grep _data2 | grep    weak    >/dev/null
        nm -m main-${ARCH} | grep _data3 | grep -v weak    >/dev/null
        nm -m main-${ARCH} | grep _data4 | grep    weak    >/dev/null
        nm -m main-${ARCH} | grep _data2 | grep    weak    >/dev/null
        nm -m main-${ARCH} | grep _data3 | grep -v weak    >/dev/null
        nm -m main-${ARCH} | grep _data4 | grep    weak    >/dev/null
-       nm -m main-${ARCH} | grep _data5 | grep -v weak    >/dev/null
-       nm -m main-${ARCH} | grep _data6 | grep    weak    >/dev/null
-       #otool -rv main-${ARCH} | grep _data6 > /dev/null
+       otool -rv main-${ARCH} | grep _data6 > /dev/null
        ${FAIL_IF_BAD_MACHO} main-${ARCH}
 
        ${FAIL_IF_BAD_MACHO} main-${ARCH}
 
-       ${CC} ${CCFLAGS} main.c -dynamiclib -o main-${ARCH}.dylib libfoo-${ARCH}.dylib 
+       ${CC} ${CCFLAGS} -mmacosx-version-min=10.4 main.c -dynamiclib -o main-${ARCH}.dylib libfoo-${ARCH}.dylib 
        nm -m main-${ARCH}.dylib | grep _func1 | grep -v weak    >/dev/null
        nm -m main-${ARCH}.dylib | grep _func2 | grep    weak    >/dev/null
        nm -m main-${ARCH}.dylib | grep _func3 | grep -v weak    >/dev/null 
        nm -m main-${ARCH}.dylib | grep _func1 | grep -v weak    >/dev/null
        nm -m main-${ARCH}.dylib | grep _func2 | grep    weak    >/dev/null
        nm -m main-${ARCH}.dylib | grep _func3 | grep -v weak    >/dev/null 
@@ -57,7 +55,7 @@ all:
        nm -m main-${ARCH}.dylib | grep _data2 | grep    weak    >/dev/null
        nm -m main-${ARCH}.dylib | grep _data3 | grep -v weak    >/dev/null
        nm -m main-${ARCH}.dylib | grep _data4 | grep    weak    >/dev/null
        nm -m main-${ARCH}.dylib | grep _data2 | grep    weak    >/dev/null
        nm -m main-${ARCH}.dylib | grep _data3 | grep -v weak    >/dev/null
        nm -m main-${ARCH}.dylib | grep _data4 | grep    weak    >/dev/null
-       #otool -rv main-${ARCH}.dylib | grep _data6 > /dev/null
+       otool -rv main-${ARCH}.dylib | grep _data6 > /dev/null
        ${PASS_IFF_GOOD_MACHO} main-${ARCH}.dylib
        
 clean:
        ${PASS_IFF_GOOD_MACHO} main-${ARCH}.dylib
        
 clean: