From 4be885f63e03d78a3780e8041f107657f85eb5cb Mon Sep 17 00:00:00 2001 From: Apple Date: Tue, 16 Jun 2009 01:58:03 +0000 Subject: [PATCH] ld64-95.8.4.tar.gz --- ChangeLog | 4536 +---------------- doc/man/man1/ld.1 | 4 + src/ld/Architectures.hpp | 6 +- src/ld/LTOReader.hpp | 3 +- src/ld/MachOReaderDylib.hpp | 9 +- src/ld/MachOReaderRelocatable.hpp | 423 +- src/ld/MachOWriterExecutable.hpp | 278 +- src/ld/ObjectFile.h | 7 +- src/ld/Options.cpp | 20 +- src/ld/ld.cpp | 64 +- src/other/dyldinfo.cpp | 15 +- src/other/unwinddump.cpp | 390 +- unit-tests/run-all-unit-tests | 2 - .../coalesce_weak_def_in_dylib/Makefile | 55 - .../coalesce_weak_def_in_dylib/foo.c | 4 - .../coalesce_weak_def_in_dylib/main.c | 17 - .../test-cases/cstring-alt-segment/custom.s | 8 - .../test-cases/cstring-alt-segment/main.c | 7 - unit-tests/test-cases/cstring-labels/foo.c | 2 - .../dead_strip-r_symbol_desc/Makefile | 43 - .../test-cases/dead_strip-weak-coalesce/baz.c | 7 - .../test-cases/dead_strip-weak-coalesce/foo.c | 25 - .../dead_strip-weak-coalesce/main.c | 13 - .../eh-coalescing-no-labels/Makefile | 2 +- unit-tests/test-cases/init-order/Makefile | 4 +- .../test-cases/init-order/expected-order.txt | 2 + unit-tests/test-cases/kext-basic/Makefile | 1 + .../Makefile | 9 +- .../test-cases/label-on-end-of-section/foo.s | 17 + unit-tests/test-cases/no-data-bundle/foo.c | 6 - .../Makefile | 14 +- .../main.c | 19 +- .../objc-literal-pointers-strip/Makefile | 57 - unit-tests/test-cases/operator-new/Makefile | 5 +- unit-tests/test-cases/operator-new/main.cxx | 2 +- .../re-export-optimizations-indirect/Makefile | 64 - .../re-export-optimizations-indirect/bar.c | 5 - .../re-export-optimizations-indirect/foo.c | 4 - .../re-export-optimizations-indirect/main.c | 8 - .../re-export-optimizations-indirect/middle.c | 3 - .../re-export-optimizations-indirect/other.c | 1 - .../test-cases/relocs-neg-from-local/Makefile | 51 - .../test-cases/relocs-neg-from-local/test.s | 43 - .../Makefile | 8 +- .../test.m => section-labels/main.c} | 34 +- .../test-cases/section-names-long/Makefile | 42 - unit-tests/test-cases/section-names-long/a.s | 9 - unit-tests/test-cases/section-names-long/b.s | 9 - unit-tests/test-cases/section-names-long/c.s | 11 - .../test-cases/section-names-long/main.c | 4 - .../test-cases/shared-cache-dylib/Makefile | 46 - .../test-cases/shared-cache-dylib/foo.c | 3 - .../stripped-indirect-symbol-table/Makefile | 14 +- unit-tests/test-cases/weak_import/Makefile | 10 +- 54 files changed, 546 insertions(+), 5899 deletions(-) delete mode 100644 unit-tests/test-cases/coalesce_weak_def_in_dylib/Makefile delete mode 100644 unit-tests/test-cases/coalesce_weak_def_in_dylib/foo.c delete mode 100644 unit-tests/test-cases/coalesce_weak_def_in_dylib/main.c delete mode 100644 unit-tests/test-cases/cstring-alt-segment/custom.s delete mode 100644 unit-tests/test-cases/cstring-alt-segment/main.c delete mode 100644 unit-tests/test-cases/dead_strip-r_symbol_desc/Makefile delete mode 100644 unit-tests/test-cases/dead_strip-weak-coalesce/baz.c delete mode 100644 unit-tests/test-cases/dead_strip-weak-coalesce/foo.c delete mode 100644 unit-tests/test-cases/dead_strip-weak-coalesce/main.c rename unit-tests/test-cases/{no-data-bundle => label-on-end-of-section}/Makefile (82%) create mode 100644 unit-tests/test-cases/label-on-end-of-section/foo.s delete mode 100644 unit-tests/test-cases/no-data-bundle/foo.c rename unit-tests/test-cases/{dead_strip-weak-coalesce => no_zero_fill_sections}/Makefile (70%) rename unit-tests/test-cases/{dead_strip-r_symbol_desc => no_zero_fill_sections}/main.c (90%) delete mode 100644 unit-tests/test-cases/objc-literal-pointers-strip/Makefile delete mode 100644 unit-tests/test-cases/re-export-optimizations-indirect/Makefile delete mode 100644 unit-tests/test-cases/re-export-optimizations-indirect/bar.c delete mode 100644 unit-tests/test-cases/re-export-optimizations-indirect/foo.c delete mode 100644 unit-tests/test-cases/re-export-optimizations-indirect/main.c delete mode 100644 unit-tests/test-cases/re-export-optimizations-indirect/middle.c delete mode 100644 unit-tests/test-cases/re-export-optimizations-indirect/other.c delete mode 100644 unit-tests/test-cases/relocs-neg-from-local/Makefile delete mode 100644 unit-tests/test-cases/relocs-neg-from-local/test.s rename unit-tests/test-cases/{cstring-alt-segment => section-labels}/Makefile (80%) rename unit-tests/test-cases/{objc-literal-pointers-strip/test.m => section-labels/main.c} (71%) delete mode 100644 unit-tests/test-cases/section-names-long/Makefile delete mode 100644 unit-tests/test-cases/section-names-long/a.s delete mode 100644 unit-tests/test-cases/section-names-long/b.s delete mode 100644 unit-tests/test-cases/section-names-long/c.s delete mode 100644 unit-tests/test-cases/section-names-long/main.c delete mode 100644 unit-tests/test-cases/shared-cache-dylib/Makefile delete mode 100644 unit-tests/test-cases/shared-cache-dylib/foo.c diff --git a/ChangeLog b/ChangeLog index 79dcc59..ab1e984 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,174 +1,114 @@ ------ Tagged ld64-95.2.12 +----- Tagged ld64-95.9 -2009-07-02 Nick Kledzik +2009-02-13 Nick Kledzik - creation of __unwind_info section can fail if hundreds of functions cannot be compact encoded + 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 +2009-03-31 Nick Kledzik - Link Time Optimization errors out when targeting < 10.6 - - ------ Tagged ld64-95.2.10 - -2009-04-02 Nick Kledzik - - 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 - - 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 - - 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 - - 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 + 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 +----- Tagged ld64-95.8.2 - 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 + * src/ld/MachOReaderRelocatable.hpp: back out -force_cpusubtype_ALL changes -2009-03-10 Nick Kledzik - 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 ------ Tagged ld64-95.2.6 - -2009-02-27 Nick Kledzik - - 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 + -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 - - 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 ------ Tagged ld64-95.2.4 - -2009-02-23 Nick Kledzik + 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 +2009-02-09 Nick Kledzik - Writer::symbolIndex() uses a linear search and does not scale - * src/ld/MachOWriterExecutable.hpp: build a std::map so symbolIndex() scales better - + 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 - 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 +2009-02-06 Nick Kledzik - 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 +2009-02-06 Nick Kledzik - 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 + 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 +2009-02-05 Nick Kledzik - -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 + 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 +2009-01-27 Nick Kledzik - x86_64 weak_import broken for initialized data - * src/ld/MachOReaderRelocatable.hpp: use isWeakImportSymbol() in Reader::addRelocReference() - * src/other/dyldinfo.cpp: update to display weak_import attribute - * unit-tests/test-cases/weak_import: updated test case + 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 - - 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 ------ Tagged ld64-95.2.3 + 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 - 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 ------ Tagged ld64-95.2.2 + * src/ld/MachOWriterExecutable.hpp: in hasPageCrossingBranches() ignore branches preceeded by a branch -2009-02-02 Nick Kledzik - 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 ------ Tagged ld64-95.2.1 + * src/ld/Options.cpp: handle -kext and -r the same for fPreventPageCrossingBranches -2009-01-29 Nick Kledzik - 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 +2009-01-14 Nick Kledzik - 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 + 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 @@ -176,4359 +116,3 @@ 2009-01-06 Nick Kledzik 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 - - * 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 - - * src/ld/Options.cpp: move check for fSharedRegionEligible until fPrebind has stabilized - - -2008-12-18 Nick Kledzik - - 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 - - * src/ld/Options.cpp: Fix -F handling in buildSearchPaths() - - ------ Tagged ld64-94 - -2008-12-15 Nick Kledzik - - * doc/man/man1/ld.1: document new options - - -2008-12-15 Nick Kledzik - - 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 - - -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 - - 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 - - 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 - - * src/ld/ObjectFile.h: add fIPhoneVersionMin to track min iPhoneOS version - * src/ld/Options.cpp: use fIPhoneVersionMin - - -2008-12-11 Nick Kledzik - - 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 - - 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 - - * 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 - - * src/ld/MachOReaderRelocatable.hpp: Fix getDescription() to work when direct reference is to anonymous atom - - -2008-12-10 Nick Kledzik - - * src/ld/Options.cpp: enable LD_FORCE_NO_PREBIND to be used with arm - - -2008-12-10 Nick Kledzik - - Developer tool to print the new compressed LINKEDIT information - * src/other/dyldinfo.cpp: fix typo in usage() - - -2008-12-05 Nick Kledzik - - 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 - - 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 - - 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 - - * src/ld/debugline.c: fix error handling in line_open() - - -2008-11-26 Nick Kledzik - - 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 - - * src/ld/Option.cpp: Fix how crashreporterBuffer is created to not miss some arguments - - -2008-11-24 Nick Kledzik - - 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 - - * 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 - - 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 - - * 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 - - 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 - - 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 - - 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 - - LTO doesn't like dtrace symbols - * src/ld/LTOReader.hpp: ignore __dtrace_probe undefines in bitcode files - - -2008-11-14 Nick Kledzik - - * src/abstraction/MachOFileAbstraction.hpp: fix to work with 10.5 headers - - ------ Tagged ld64-91 - -2008-11-07 Nick Kledzik - - Remove COMPACT_UNWIND_SUPPORT conditionalizing - - -2008-11-06 Nick Kledzik - - Reorganize source layout. ld sources are now in "ld", - and other tools are in "other". - - -2008-11-05 Nick Kledzik - - * 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 - - 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 - - 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 - - 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 - - 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 - - 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 - - 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 - - * src/MachOReaderRelocatable.hpp: support all encodings in getEncodedP() - - ------ Tagged ld64-90 - -2008-10-30 Nick Kledzik - - icc has dwarf unwind info that is different than gcc - * src/MachOReaderRelocatable.hpp: support more encodings in getEncodedP() - - -2008-10-23 Nick Kledzik - - build ld64 for x86_64 - * ld64.xcodeproj/project.pbxproj: add X86_64 to valid archs - - -2008-10-23 Nick Kledzik - - * 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 - - 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 - - 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 - - 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 - - * src/MachOReaderRelocatable.hpp: for x86_64 __eh_frame force direct references - - -2008-10-21 Nick Kledzik - - * src/ObjectDump.cpp: Use getContentType() to see if content type is a cstring - - ------ Tagged ld64-89 - -2008-10-21 Nick Kledzik - - 10A180 with QT-1119 roots: iTunes and QuickTime cannot play back purchased videos - 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 - - * src/MachOReaderRelocatable.hpp: Fix uses of COMPACT_UNWIND_SUPPORT - * src/MachOWriterExecutable.hpp: Fix uses of COMPACT_UNWIND_SUPPORT - - -2008-09-30 Nick Kledzik - - OBJC2: Reorder __DATA,__objc_* sections by writedness - * src/ld.cpp: change sorting order of Sections - - -2008-09-29 Nick Kledzik - - 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 - - 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 - - ld invoking wrong ld_classic - * src/Options.cpp: first look for ld_classic relative to ld itself - - -2008-09-25 Nick Kledzik - - ld fails to link references from 32 bit code into 64 bit code - 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 - - 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 - - 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 - - -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 - - 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 - - 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 - - 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 - - -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 - - 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 - - "-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 - - * src/MachOReaderRelocatable.hpp: add warning if dwarf cannot be encoded as compact unwind - - -2008-09-18 Nick Kledzik - - * src/LTOReader.hpp: re-enable use of lto_codegen_debug_options() - - -2008-09-16 Nick Kledzik - - 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 - - * 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 - - 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 - - * src/MachOReaderRelocatable.hpp: fix compact unwind personality for dyld and -slow_stubs - - -2008-08-29 Nick Kledzik - - -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 - - 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 - - * src/Options.cpp: back out - - ------ Tagged ld64-87.5 - -2008-08-26 Nick Kledzik - - 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 - - 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 - - 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 - - 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 - - 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 - - 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 - - * src/LTOReader.hpp: Don't use lto_codegen_debug_options until newer libLTO.dylib is available - - ------ Tagged ld64-87 - -2008-07-21 Nick Kledzik - - * src/Options.cpp: Always set fAutoOrderInitializers=false for dyld - - -2008-07-21 Nick Kledzik - - * 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 - - * ld64.xcodeproj/project.pbxproj: don't allow ld to build for x86_64 until libdtrace.dylib is available - - -2008-07-18 Nick Kledzik - - * src/MachOReaderRelocatable.hpp: don't crash if debug_line section has no line table - - -2008-07-18 Nick Kledzik - - 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 - - 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 - - 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 - - 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 - - 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 - - * src/LTOReader.hpp: improve missing symbol error message - - -2008-07-09 Nick Kledzik - - linker should order __DATA segment to reduce dyld dirtied pages - * src/ld.cpp: first phase, order sections - - -2008-07-08 Nick Kledzik - - * src/MachOReaderRelocatable.hpp: remove "coal" sections when creating a final linked image - - -2008-07-08 Nick Kledzik - - 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 - - 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 - - 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 - - ld crashes when bad ppc relocs are found - * src/MachOReaderRelocatable.hpp: change all missing PAIR warnings to errors - - -2008-07-02 Nick Kledzik - - 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 - - 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 - - * 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 - - * src/ld.cpp: fix loadUndefines() to double check undefine symbol was not already loaded - - ------ Tagged ld64-86.2 - -2008-06-14 Nick Kledzik - - * srd/ld.cpp: Add NULL check in getTentativesNames() - - ------ Tagged ld64-86.1 - -2008-06-06 Nick Kledzik - - * src/MachOWriterExecutable.hpp: fix header padding calculation for dyld - - ------ Tagged ld64-86 - -2008-06-04 Nick Kledzik - - * src/LTOReader.hpp: if lto_codegen_add_module() fails, add explanation to error message - - -2008-06-04 Nick Kledzik - - * 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 - - 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 - - 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 - - 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 - - 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 - - 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 - - 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 - - * 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 - - * unit-tests: fixes to build all tests with with gcc-4.2 on SnowLeopard - - -2008-05-30 Nick Kledzik - - 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 - - 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 - - support increased branch range in Thumb-2 - * src/MachOWriterExecutable.hpp: in fixUpReferenceFinal() support new longer branch range - - -2008-11-01 Nick Kledzik - - 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 - - vtable pointers can be missing thumb bit - * src/MachOWriterExecutable.hpp: Writer::fixUpReferenceFinal() OR in the 1 bit if the target - of a arm::kReadOnlyPointer is thumb. - - ------ Tagged ld64-85.4 - -2008-08-11 Nick Kledzik - - 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 - - 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 - - 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 - - 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 - - * ld64.xcodeproj/project.pbxproj: is moving from /usr/local/include to /Developer/usr/local/include - - -2008-04-29 Nick Kledzik - - ld doesn't honor "rightmost" -syslibroot argument - * src/Options.cpp: if last -syslibroot is /, then ignore all syslibroots - - -2008-04-29 Nick Kledzik - - 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 - - * src/MachOReaderRelocatable.hpp: better cpu subtype support - - -2008-04-14 Nick Kledzik - - 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 - - * src/MachOWriterExecutable.hpp: fix stubs used with lazy dylibs - - ------ Tagged ld64-84.4 - -2008-04-10 Nick Kledzik - - 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 - - -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 - - * 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 - - 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 - - * src/LTOReader.hpp: don't print lto version, if lto is unavailable - - -2008-03-26 Nick Kledzik - - 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 - - Need encryption tag in mach-o file - 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 - - 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 - - ld64 should switch to new libLTO.dylib interface - 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 - - * 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 - - 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 - - * src/Options.cpp: warn if -seg1addr value is not page aligned - - -2008-03-21 Nick Kledzik - - 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 - - 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 - - -iphone_version_min ==> -iphoneos_version_min - * src/Options.cpp: support -iphoneos_version_min as well - - ------ Tagged ld64-83 - -2008-03-10 Nick Kledzik - - 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 - - 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 - - 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 - - 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 - - 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 - - Simulator frameworks are being build split-seg and not prebound - * src/Options.cpp: only splitseg if prebound - - -2008-02-29 Nick Kledzik - - 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 - - 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 - - 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 - - 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 - - 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 - - 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 - - * 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 - - 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 - - Can't build 64-bit Intel binaries with LTO - 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 - - * src/MachOReaderRelocatable.hpp: don't bus error if S_LITERAL_POINTERS is missing relocs - - -2008-01-22 Nick Kledzik - - 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 - - Bad grammar used in ld warning: cannot exported hidden symbol - * src/ld.cpp: fix typo in warning string - - -2008-01-16 Nick Kledzik - - Bundle Loader does not work anymore when loader is a bundle - 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 - - 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 - - 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 - - * src/LLVMReader.hpp: Use __gnu_cxx::hash_map instead of hash supported by LLVM. - - -2008-01-16 Nick Kledzik - - 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 - - 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 - - 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 - - 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 - - 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 - - * doc/man/man1/ld.1: add doc for -no_implicit_dylibs, -read_only_stubs, -slow_stubs, -interposable_list - - -2008-01-11 Nick Kledzik - - ld64(1) man page uses ambiguous term "suffix" - * doc/man/man1/ld.1: make meaning of "suffix" more explicit - - -2008-01-11 Nick Kledzik - - 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 - - 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 - - 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 - - __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 - - 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 - - * src/LLVMReader.hpp: Add LLVM_LTO_VERSION #ifdef check. - -2007-12-19 Devang Patel - - * src/LLVMReader.hpp: Add fOptimizer NULL check before calling printVersion(). - -2007-12-19 Devang Patel - - 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 - - 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 - - * src/LLVMReader.hpp: Invalidate input architecture when optimizer is not available. - ------ Tagged ld64-81.3 - -2007-12-17 Nick Kledzik - - * ld64.xcodeproj/project.pbxproj: remove extraneous header search paths - - -2007-12-17 Devang Patel - - * 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 - - gcc DejaGnu failure: gcc.dg/20020312-2.c (test for excess errors) (-fstack-protector-all) - * src/MachOWriterExecutable.hpp: fix Writer::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 - - 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 - - SWB: failures due to ld: pointer in read-only segment not allowed in slidable image, used in ... - * src/MachOReaderRelocatable.hpp: in Reader::addRelocReference() handle weak pc-rel 32-bit vanilla relocs properly - ------ Tagged ld64-81.2 - - - -2007-12-07 Nick Kledzik - - 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 - - * src/MachOReaderDylib.hpp: rework cycle detection to remove some false positives - - -2007-12-05 Nick Kledzik - - 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 - - * 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 - - 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 - - * 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 - - 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 - - ld64 does not support -aspen_version_min 2.0 - * src/Options.cpp: allow 2.x for -aspen_version_min - - -2008-02-11 Nick Kledzik - - 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 - - -iphone_version_min ==> -aspen_version_min - * src/Options.cpp: support -aspen_version_min - - ------ Tagged ld64-80.8 - -2008-01-10 Nick Kledzik - - * 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 - - BigBear5A18 isn't fully prebound - * src/Options.cpp: make fNeedsModuleTable true for arm - ------ Tagged ld64-80.6 - -2007-11-30 Nick Kledzik - - -iphone_version_min - * src/Options.cpp: handle -iphone_version_min option - - ------ Tagged ld64-80.5 - -2007-11-26 Nick Kledzik - - 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 - - * 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 - - * 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 - - * src/ld.cpp: hack my own prototype for log2() until math.h is cleaned up - - ------ Tagged ld64-80.1 - -2007-11-01 Nick Kledzik - - * 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 - - 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 - - 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 - - * src/MachOWriterExecutable.hpp: keep old style dtrace probes externel for kernel builds - - -2007-10-23 Nick Kledzik - - unify error and warning messages - -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 - - * 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 - - * 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 - - * src/Options.cpp: have -static arm code link with ld_classic (for now) - - -2007-10-22 Nick Kledzik - - 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 - - * src/*: merge in arm support - * unit-tests/test-cases/*: fix to work for arm and thumb - ------ Tagged ld64-79 - -2007-10-16 Nick Kledzik - - * 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 - - * src/MachOWriterExecutable.hpp: fix edge case in branch island generation - - -2007-10-12 Nick Kledzik - - Add option to create old, slow stubs for i386 - * src/ObjectFile.h/.cpp: support -read_only_stubs - * src/MachOWriterExecutable.hpp: enhance StubAtom 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 - - 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 - - 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 - - -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 - - 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 - - linker does not error when dylib ordinal exceeds 250 - * src/MachOWriterExecutable.hpp: error out if ordinals exceed max allowed - - -2007-10-10 Nick Kledzik - - 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 - - No warning about tentative definition conflicting with dylib definition - .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 - - 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 - - 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 - - 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 - - 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 - - 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 - - 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 - - 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 - - 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 - - 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 - - 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 - - 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 - - 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 - - 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 - - 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 - - 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 - - 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 - - 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 - - -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 - - 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 - - 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 - - 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 - - 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 - - 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 - - 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 - - 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 - - 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 - - ld64 drops fix&continue bit in __OBJC, __image_info. - * src/MachOReaderRelocatable.hpp: implement objcReplacementClasses() - - -2007-05-15 Nick Kledzik - - 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 - - * unit-tests/include/common.makefile: set COMPILER_PATH so harness works with latest compiler - - ------ Tagged ld64-74.2 - -2007-05-11 Nick Kledzik - - 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 - - * src/Options.h: add emitWarnings() - * src/Options.cpp: wire up -w to emitWarnings() - - -2007-05-09 Nick Kledzik - - 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 - - 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 - - typo in error message for linking -pie - * src/MachOWriterExecutable.hpp: fix typo in error messages - - ------ Tagged ld64-74 - -2007-05-03 Nick Kledzik - - ld64 can't find @executable _path relative dylibs from our umbrella frameworks - 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 - - * 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 - - typo in message, frameowrk - * src/Options.cpp: fix typo - - -2007-05-01 Nick Kledzik - - "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 - - ld doesn't handle -mlong-branch .o files that have had local symbols stripped - 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 - - 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 - - ld does not report error when -r is used and exported symbols are not defined. - 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 - - 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 - - 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 - - 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 - - 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 - - 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 - - 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 - - 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 - - * 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 - - 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 - - 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 - - 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 - - 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 - - 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 - - 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 - - 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 - - -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 - - * 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 - - 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 - - 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 - - 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 - - * 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 - - ER: -dead_strip_dylibs - 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 - - * 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 - - 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 - - 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. 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 - - Typo in ld man page (-exported_symbols_list) - * doc/man/man1/ld.1: fix typo - - -2007-03-26 Nick Kledzik - - 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 - - * src/MachOWriterExecutable.hpp: restructure writeAtoms() to copy all atoms in memory if possible - - -2007-03-24 Nick Kledzik - - 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 - - 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 - - * src/ld.cpp: fix -print_statistics when using -dead_strip - - -2007-03-23 Nick Kledzik - - * src/MachOReaderRelocatable.hpp: generate better names for non-lazy pointers to the interior of atoms - - -2007-03-16 Nick Kledzik - - * src/MachOWriterExecutable.hpp: speed up ld -r a little by reversing relocs en mas - - -2007-03-16 Nick Kledzik - - ld Bus Error on missing command line arguments - * src/Options.cpp: check next argv[] is not NULL - - -2007-03-16 Nick Kledzik - - 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 - - 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 - - Linker returns success although exported symbols are undefined. - * src/ld.cpp: turn missing symbols back into an error - - -2007-03-16 Nick Kledzik - - 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 - - linker should add implicit load commands for indirectly used public dylibs - Indirect libraries should be found using -F and -L options - 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 - - 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 - - * src/Options.cpp: ignore .objc_category_name_* symbols in .exp files - - -2007-03-06 Nick Kledzik - - * src/Options.cpp: stop special casing mach_kernel and instead requre kernel to be built with -new_linker - - -2007-03-06 Nick Kledzik - - 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 - - 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 - - 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 - - * 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 - - * doc/man/man1/ld.1: Add descriptions to all "rarely used options" - - -2007-03-01 Nick Kledzik - - 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 - - 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 - - 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 - - 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 - - * src/MachOWriterExecutable.hpp: rework how padding after load commands is calculated - - -2007-02-21 Nick Kledzik - - * src/MachOWriterExecutable.hpp: extend special case of __mh_execute_header to static executables too - - -2007-02-21 Nick Kledzik - - 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 - - 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 - - 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 - - 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 - - * src/ld.cpp: sort __OBJC2 segment to be next to __OBJC segment - - -2007-02-07 Nick Kledzik - - * src/Options.cpp: change missing -seg_addr_table from an error to a warning - - -2007-02-06 Nick Kledzik - - 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 - - * src/MachOReaderDylib.hpp: don't warn about zero size __image_info sections - - -2007-02-04 Rick Balocca - Enable the failing cases for missing command line arguments - -2007-02-04 Rick Balocca - Make sure that all .o's are checked by ObjectDump - and all macho are checked by machochecker - -2007-02-04 Rick Balocca - Fix an endian problem with machochecker - Fix blank-stubs Makefile - ------ Tagged ld64-71 - -2007-02-02 Rick Balocca - 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 - make cpu-sub-types test more robust - -2007-02-01 Rick Balocca - auto-arch tests were resulting in a false FAILs - -2007-02-01 Rick Balocca - test cpu-sub-types was resulting in a false FAIL - -2007-02-01 Nick Kledzik - - 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 - - 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 - - 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 - - * src/MachOWriterExecutable.hpp: in addObjectRelocs_powerpc() mask scattered r_address to 16-bits - ------ Tagged ld64-70 - - -2007-01-30 Nick Kledzik - - linker should verify GC consistency of modules being linked into library - 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 - - src/*: remove ObjectFile::requiresFollowOnAtom() method - - -2007-01-28 Nick Kledzik - - 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 - * src/ObjectDump.cpp: The usage() message was incorrect. - - -2007-01-25 Rick Balocca - * 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 - - 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 - - * 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 - - ld64 --help isn't recognized - * src/Options.cpp (Options::parse): Support --help and -help. - - -2007-01-15 Nick Kledzik - - * src/MachOFileAbstraction.hpp: add range checking on macho_scattered_relocation_info::set_r_address() - - -2007-01-14 Nick Kledzik - - 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 - - [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 - - 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 - - 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 - - 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 - - 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 - - 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 - - * 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 - - -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 - - 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 - - -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 - - -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 - - 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 - - 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 - - symbols with REFERENCED_DYNAMICALLY should never be stripped - * src/MachOWriterExecutable.hpp: update Writer::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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - 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 - - * 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 - - 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 - - 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 - - -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 - - * src/MachOWriterExecutable.hpp: support __IMPORT segment being slide independently of __DATA segment in shared cache - - -2006-11-16 Nick Kledzik - - 9a303: ld -filelist Bus Error - * src/Options.cpp: add check that -filelist is followed by an argument - - -2006-11-16 Nick Kledzik - - * src/MachOWriterExecutable.hpp: when building split-seg dylibs, LINKEDIT goes in read-only side - - -2006-11-15 Nick Kledzik - - * 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 - - * src/MachOReaderRelocatable.hpp: redirect references to static weak stubs to the real target - - -2006-11-09 Nick Kledzik - - * 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 - - * src/MachOWriterExecutable.hpp: initialize fModuleInfoAtom to zero - - -2006-11-08 Nick Kledzik - - 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 - - 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 - - * 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 - - 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 - - * 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 - - 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 - - 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 - - * 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 - - 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 - - * src/LLVMReader.hpp: Supply final output file path to optimizer. - -2006-10-26 Devang Patel - - * src/ObjectFile.h: Make setSection* methods virtual. - * src/LLVMReader.hpp: Override setSection* methods. - -2006-10-26 Devang Patel - - * 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 - - * src/options.h, src/options.cpp: Add -save-temps command line option. - * src/LLVMReader.hpp: Use saveTemps option. - - -2006-10-26 Devang Patel - - * src/LLVMReader.hpp: Remove invalid module from memory. - -2006-10-26 Devang Patel - - * src/LLVMReader.hpp: Collect symbol alignment info from LLVM optimizer. - -2006-10-21 Eric Christopher - - * 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 - - * ld64.xcodeproj/project.pbxproj: stop copying LLVMReader.hpp into man1 directory - ------ Tagged ld64-64.1 - -2006-10-19 Nick Kledzik - - 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 - - * 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 - - ld64 change required to go with assembler cstring change - 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 - - 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 - - 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 - - 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 - - * 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 - - * src/MachOReaderRelocatable.hpp: rework dwarf line parsing to fix warnings that starting - showing up with gcc-5421 - - -2006-10-05 Eric Christopher - - 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 - - * src/Options.cpp (Options::gotoClassicLinker): Use execvp - to call ld_classic. - -2006-10-03 Eric Christopher - - * unit-tests/test-cases/tentative-to-real/Makefile: Clean up after tests. - -2006-10-03 Eric Christopher - - * unit-tests/include/common.makefile (VALID_ARCHS): Add x86_64. - (OTOOL): Remove munging based on ARCH. - -2006-09-29 Nick Kledzik - - 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 - - src/Options.h/.cpp: add support for -segaddr option - src/MachOWriterExecutable.hpp: In Writer::assignFileOffsets(), use -segaddr info - - -2006-09-28 Nick Kledzik - - 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 - - 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 - - ld64.xcodeproj/project.pbxproj: remove accidental install of source file into man1 - - -2006-09-25 Nick Kledzik - - 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 - - src/MachOWriterExecutable.hpp: include stubs in LC_SEGMENT_SPLIT_INFO - - -2006-09-21 Nick Kledzik - - src/Options.cpp: disable split-seg dylibs for 64-bit architectures - - -2006-09-19 Nick Kledzik - - 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 - - src/MachOWriterExecutable.hpp: rework encoding of LC_SEGMENT_SPLIT_INFO - - -2006-09-19 Nick Kledzik - - src/Options.cpp: check for -search_paths_first in first pass - - ------ Tagged ld64-63 - -2006-09-15 Nick Kledzik - - 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 - - src/Options.cpp: support -r -static - src/MachOWriterExecutable.hpp: support -r -static an don't generate LC_DYSYMTAB - - -2006-09-14 Nick Kledzik - - 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 - - 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 - - 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 - - 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 - - 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 - - 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 - - need -i for 64-bit (or equivalent) - 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 - - 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 - - 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 - - Add convention for removing symbols at link time - 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 - - 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 - - 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 - - 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 - - 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 - - remove OPEN_SOURCE conditionals around x86_64 support - - -2006-07-31 Nick Kledzik - - 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 - - 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 - - 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 - - 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 - - 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 - - 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 - - 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 - - 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 - - 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 - - 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 - - src/MachOReaderRelocatable.hpp: handle N_GSYM without ending :G() since that is how - dwarf debug notes are formed. - -2006-06-23 Nick Kledzik - - - - 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 - - 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 - - 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 - - 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 - - src/rebase.cpp: fix page alignment problem - src/rebase.cpp: fix endianess problem with local non-lazy pointers - -2006-06-15 Nick Kledzik - - src/rebase.cpp: fix to build in CurryWeed - ld64.xcodeproj/project.pbxproj: fix to build properly in CurryWeed - -2006-06-15 Nick Kledzik - - 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 - - SECTION_ATTRIBUTES unset in ppc64 mach-o header - src/MachOWriterExecutable.hpp: add section attribute for sections with code - -2006-06-15 Nick Kledzik - - ld64 bogus duplicate symbol name linking GNU libobjc - src/MachOReaderRelocatable.hpp: only special case Apple objc runtime objc classes - -2006-06-15 Nick Kledzik - - x86_64: ".align" directive not honored - src/MachOReaderRelocatable.hpp: change code alignment to not depend on atom size - -2006-06-14 Nick Kledzik - - 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 - - src/Options.cpp: allow -image_base as an alias for -seg1addr - -2006-06-13 Nick Kledzik - - 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 - - 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 - - -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 - - 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 - - src/machochecker.cpp: add some ppc reloc sanity checking - ------ Tagged ld64-57 - -2006-06-06 Nick Kledzik - - 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 - - -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 - - 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 - - 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 - - ld64 spends much time in mach_o::relocatable::Reader::findAtomByName - * src/MachOReaderRelocatable.hpp: add makeReferenceToSymbol() so that x86_64 does not need to do by-name lookups - -2006-05-22 Nick Kledzik - - 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 - - ld64 does not honor -arch_multiple - * ld.cpp: If fOptions.printArchPrefix(), add architecture name to error message - -2006-05-19 Nick Kledzik - - 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 - - "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 - - 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 - - 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 - - ld64: .section defaults to read-only - * src/MachOReaderRelocatable.hpp: default unknown segments to r/w - -2006-05-18 Nick Kledzik - - -fvisibility=hidden causes crashes for x86_64 - * src/MachOWriterExecutable.hpp: properly handle RIP relative tentative definitions - -2006-05-12 Nick Kledzik - - * 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 - - CF-393 failes to link for x86_64 - * src/MachOWriterExecutable.cpp: fix sign extension for Rel32 relocs in Writer::fixUpReferenceRelocatable - -2006-05-11 Nick Kledzik - - 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 - - x86_64: .objc_class_name symbol names scrambled - * src/MachOReaderRelocatable.hpp: properly compute alignment of __OBJC __class sections - - -2006-05-08 Nick Kledzik - - 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 - - * src/Options.cpp: make 10.4 be minimum OS version for newer architectures - -2006-05-05 Nick Kledzik - - 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 - - * MachOWriterExecutable.hpp: fix end FUN stab to have length of function - - -2006-05-02 Nick Kledzik - - 64-bit main executables should have 4GB zero page by default - * src/Opptions.cpp: change default pagezero_size to 4GB for ppc64 - 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 - - * 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 - - * src/MachOReaderRelocatable.cpp: rework handleAnonymousNonLazyPointers() to handle anl's in the middle - the __data section too. - ------ Tagged ld64-52 - -2006-04-28 Nick Kledzik - - 64-bit: 9A152 TextEdit crashes in dlopen on bring-up - * src/MachOReaderRelocatable.cpp: rework anonymous non-lazy-pointer detection - -2006-04-28 Nick Kledzik - - 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 - - * 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 - - * 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 - - 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 - - exported symbols not properly stripped - * src/MachOReaderRelocatable.hpp: enable AnonymousAtom::setScope() - -2006-03-31 Nick Kledzik - - 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 - - ld64 should remove generated file if link errors out - * src/MachOWriterExecutable.hpp: catch exceptions in Writer::write(), delete output file, and rethrow - - ------ Tagged ld64-50 - - -2006-03-29 Nick Kledzik - - * 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 - - * src/MachOReaderRelocatable.hpp: fix spurious warning about dwarf line info - ------ Tagged ld64-49.1 - -2006-03-25 Nick Kledzik - - * MachOWriterExecutable.hpp : don't complain about ppc64 dyld being based > 4GB - ------ Tagged ld64-49 - -2006-03-24 Nick Kledzik - - * src/MachOWriterExecutable.hpp: dyld is allowed to have synthesized non-lazy pointers - 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 - - * src/MachOWriterExecutable.hpp: in Writer::fixUpReferenceFinal() fix when x86::kPointer is for an - external relocation - -2006-03-23 Nick Kledzik - - * 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 - - 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 - - .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 - - 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 - - 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 - - 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 - - crash in stub with 2GB pagezero - * src/MachOWriterExecutable.hpp: StubAtom can't be no-pic if a large zero-page is used - -2006-03-06 Nick Kledzik - - * src/Options.cpp: addSectionAlignment, warn if -sectalign alignment is not a power of two - ------ Tagged ld64-45 - - -2006-03-06 Nick Kledzik - - 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 - - * 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 - - * 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 - - * src/MachOReaderRelocatable.hpp: tighten detection of anonymous non-lazy-pointer - ------ Tagged ld64-42 - -2006-02-28 Nick Kledzik - - * src/MachOReaderRelocatable.hpp: fix x86 __IMPORT permissions for class Segment - -2006-02-28 Nick Kledzik - - SWB: ld64-37 (can't resolve symbol ___dso_handle) - * src/MachOWriterExecutable.hpp: add class DsoHandleAtom - -2006-02-28 Nick Kledzik - - * unit-tests/test-cases/literals-coalesce-alignment: added test case - * src/ld.cpp: when coalescing strings pick one with greater alignment - 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 - - * 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 - - 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 - - * src/Options.cpp: ld64 doesn't realpath(3) B&I tracing paths - -2006-02-24 Nick Kledzik - - * src/Options.cpp: 9A110: ld64 can't deal with section names >16 chars - -2006-02-23 Nick Kledzik - - * 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 - - ld64 creates corrupt executables (and has malloc errors) with -headerpad option - * src/MachOWriterExecutable.hpp: Change LoadCommandsPaddingAtom::setSize() to update fLargestAtomSize - * unit-tests/test-cases/header-pad: added - -2006-02-23 Nick Kledzik - - ld64 creates invalid static executables - * src/MachOWriterExecutable.hpp: Change MachHeaderAtom::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 - - * src/Options.cpp: chnage printf on unknown arg to a throw - ------ Tagged ld64-39 - -2006-02-20 Nick Kledzik - - * unit-tests/test-cases/read-only-relocs: added new test case - * src/MachOWriterExecutable.hpp: detect and error on relocs in read-only sections - * src/MachOReaderRelocatable.hpp: fix parsing of i386 absolute addressing relocs - -2006-02-20 Nick Kledzik - - * unit-tests/test-cases/stabs-coalesce: added new test case - * src/ld.cpp.hpp: in collectStabs removed unused stabs - ------ Tagged ld64-38 - -2006-02-17 Nick Kledzik - - * src/MachOWriterExecutable.hpp: set correct n_sect field of stabs - -2006-02-15 Nick Kledzik - - * src/MachOReaderArchive.hpp: 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 - - * src/MachOWriterExecutable.hpp (assignFileOffsets): Simplify. Add comments. - Adjust whitespace. - -2006-02-13 Nick Kledzik - - * src/MachOWriterExecutable.hpp: in Writer::fixUpReferenceRelocatable() fix kPCRel32 for external case - -2006-02-13 Nick Kledzik - - * 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 - - * src/MachOReaderRelocatable.hpp: fix use of first zero-length c-string in .o file - -2006-02-12 Nick Kledzik - - * src/MachOReaderRelocatable.hpp: fix uninitialized fAlignment - -2006-02-12 Nick Kledzik - - * 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 - - * src/MachOReaderRelocatable.cpp: rdar://problem/4438677 Handle when a .o file dwarf line info entries but no functions - -2006-02-08 Nick Kledzik - - * src/MachOWriterExecutable.cpp: Properly set address of first TEXT section - Keep S_COALESCED attribute for __eh_frame - -2006-02-08 Nick Kledzik - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * 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 - - * src/ld.cpp: fix -no_arch_warnings - 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 - - * 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 - - * 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 - - * src/MachOReaderRelocatable.hpp: properly coalesce 8-byte literals - * src/MachOWriterExecutable.hpp: support ppc64::kPointerDiff32 - ------ Tagged ld64-32 - -2006-02-02 Nick Kledzik - - * src/MachOReaderRelocatable.hpp: support anonymous zero fill atoms - -2006-02-02 Nick Kledzik - - * 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 - - * src/MachOReaderRelocatable.hpp: Support -macosx_version_min 10.5 - -2006-02-01 Nick Kledzik - - * src/MachOReaderRelocatable.hpp: don't try to parse debug_line dwarf if no symboled atoms - ------ Tagged ld64-31 - -2006-02-01 Eric Christopher - - * 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 - - * 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 - - * ld64.xcodeproj/project.pbxproj : Make buildable on Leopard - * src/MachOFileAbstraction.hpp: make buildable without latest cctools headers - -2006-01-31 Nick Kledzik - - * 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 - - * src/ExecutableFile.h: Indent. - -2006-01-30 Nick Kledzik - - * 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 - - * 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 - - * 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 - - * src/Options.cpp: verify -allow_stack_execute is only used on main executables - -2006-01-29 Nick Kledzik - - * 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 - - * src/ld.cpp (Linker::syntesizeStabs): Correct spelling. Update all uses. - -2006-01-27 Eric Christopher - - * 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 - - * 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 - - * 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 - - * src/MachOWriterExecutable.hpp: handle NULL strings in SO debug notes - -2006-01-26 Nick Kledzik - - * src/MachOWriterExecutable.hpp: fix header padding calculation and thread state - -2006-01-26 Nick Kledzik - - Rewrite all stabs processing. - Move sythesize of debug notes into ld.cpp - -2006-01-26 Nick Kledzik - - * src/MachOWriterExecutable.hpp: fix ppc and ppc64 stub relocs - -2006-01-25 Nick Kledzik - - * ld64.xcodeproj/project.pbxproj: special case building in Curry - -2006-01-25 Nick Kledzik - - * src/MachOWriterExecutable.hpp: fix bugs in stub/lazy-pointer synthesis - -2006-01-24 Eric Christopher - - * 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 - - * src/MachOReaderRelocatable.hpp: better C++ eh parsing - -2006-01-23 Eric Christopher - - * 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 - - * unit-tests/test-cases/archive-basic: added - * src/ld.cpp: fix shadowed local variable - * src/FileAbstraction.hpp: ld64 shouldn't inline when building debug - -2006-01-23 Nick Kledzik - - * 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 - - * src/MachOReaderRelocatable.hpp: tweaks to synthesizing debug notes - -2006-01-16 Nick Kledzik - - * 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 - - * src/MachOReaderRelocatable.hpp: support Tiger crt1.o build with old ld64 - * src/ObjectDump.hpp: Support -arch option - -2006-01-10 Nick Kledzik - - * 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 - - * 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 - - * track modification time of .o files so that sythesized OSO stab will have it - -2006-01-09 Nick Kledzik - - * src/MachOFileAbstraction.hpp: add macho_uuid_command - * src/MachOWriterExecutable.cpp: add UUID load command to generated files - -2006-01-09 Nick Kledzik - - * 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 - - * src/MachOReaderRelocatable.hpp: support new relocations - -2006-01-05 Nick Kledzik - - * src/MachOReaderDylib.hpp: support MH_DYLIB_STUB - * src/MachOReaderRelocatable.hpp: Add Geoff's comp unit extractor - -2006-01-05 Nick Kledzik - - 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 - - * 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 - - * Refactor: move Atom::writeContent() to Writer - -2005-12-23 Nick Kledzik - - * Reworked, simplify, and document test harness - * unit-tests/README: Added - -2005-12-23 Nick Kledzik - - * src/MachOReaderRelocatable.hpp: fixes for Objective-C - * unit-tests/test-cases/relocs-objc: Added - -2005-12-22 Nick Kledzik - - * 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 - - * 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 - - * 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 - - * src/MachOReaderRelocatable.hpp: Add comments about dwarf - -2005-12-14 Nick Kledzik - - * 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 - - * src/MachOReaderRelocatable.hpp: check for S_ATTR_DEBUG and ignore those sections - * unit-tests/test-cases/dwarf-ignore: added - -2005-12-12 Nick Kledzik - - * Added test harness and three initial tests: - relocs-asm, relocs-c, and hello-world - -2005-12-12 Nick Kledzik - - * 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 - - * src/ObjectDump.cpp: Add command line options: -no_content, -stabs, -no_sort - -2005-12-11 Eric Christopher - - * src/Options.cpp: Reformat. - * src/Options.h: Ditto. - -2005-12-07 Eric Christopher - - * 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 - - * src/Options.cpp src/Options.h: Add design comments - -2005-12-05 Eric Christopher - - * src/ld.cpp (Linker::createWriter): Uncomment ppc64 and - i386 linkers. - -2005-12-05 Eric Christopher - - * ChangeLog: New file. - -2005-12-02 Nick Kledzik - - * src/ObjectFile.h: Add design comments - -2005-11-30 Nick Kledzik - - * Fix uses of __OPEN_SOURCE__ - -2005-11-28 Nick Kledzik - - * Refactor Atom to use getDefinitionKind() - -2005-11-21 Nick Kledzik - - * src/MachOWriterExecutable.hpp: don't generate section for commons in -r mode - -2005-11-18 Nick Kledzik - - * x86 tweaks - -2005-11-18 Nick Kledzik - - * src/ObjectDump.cpp: make work with command line arguments - -2005-11-18 Nick Kledzik - - * Massive rework to remove preprocessor conditionals and use templates - -2005-11-14 Nick Kledzik - - * Created new Subversion repository for ld64 from cvs tag ld64-27.2 diff --git a/doc/man/man1/ld.1 b/doc/man/man1/ld.1 index c910e04..3a84e0a 100644 --- a/doc/man/man1/ld.1 +++ b/doc/man/man1/ld.1 @@ -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. +.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 diff --git a/src/ld/Architectures.hpp b/src/ld/Architectures.hpp index ceb448a..0d141cf 100644 --- a/src/ld/Architectures.hpp +++ b/src/ld/Architectures.hpp @@ -61,7 +61,7 @@ struct x86 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 }; }; @@ -74,7 +74,7 @@ struct x86_64 kBranchPCRel32, kBranchPCRel32WeakImport, kPCRel32GOTLoad, kPCRel32GOTLoadWeakImport, kPCRel32GOT, kPCRel32GOTWeakImport, kBranchPCRel8, kGOTNoFixUp, - kImageOffset32, kPointerDiff24, kSectionOffset24, + kImageOffset32, kPointerDiff24, kDtraceProbe, kDtraceProbeSite, kDtraceIsEnabledSite, kDtraceTypeReference }; }; @@ -83,7 +83,7 @@ struct arm typedef Pointer32 P; enum ReferenceKinds { kNoFixUp, kFollowOn, kGroupSubordinate, kPointer, kPointerWeakImport, kPointerDiff, kPointerDiff32=kPointerDiff, kReadOnlyPointer, - kBranch24, kBranch24WeakImport, kThumbBranch22, kThumbBranch22WeakImport, + kBranch24, kBranch24WeakImport, kThumbBranch22, kThumbBranch22WeakImport, kDtraceProbe, kDtraceProbeSite, kDtraceIsEnabledSite, kDtraceTypeReference }; }; diff --git a/src/ld/LTOReader.hpp b/src/ld/LTOReader.hpp index 1b8f2c3..75659e1 100644 --- a/src/ld/LTOReader.hpp +++ b/src/ld/LTOReader.hpp @@ -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: - case LTO_SYMBOL_DEFINITION_WEAKUNDEF: 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: - return "arm"; + return "arm-"; } return ""; } diff --git a/src/ld/MachOReaderDylib.hpp b/src/ld/MachOReaderDylib.hpp index 8aea6ef..13faf3d 100644 --- a/src/ld/MachOReaderDylib.hpp +++ b/src/ld/MachOReaderDylib.hpp @@ -780,18 +780,13 @@ void Reader::processIndirectLibraries(DylibHander* handler) //fprintf(stderr, "processIndirectLibraries() implicitly linking %s\n", child->getInstallPath()); ((Reader*)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); - //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); - //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 ) { diff --git a/src/ld/MachOReaderRelocatable.hpp b/src/ld/MachOReaderRelocatable.hpp index e576313..ef8cfb2 100644 --- a/src/ld/MachOReaderRelocatable.hpp +++ b/src/ld/MachOReaderRelocatable.hpp @@ -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 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; } @@ -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::Reference* getFDE(); virtual Atom* getPersonalityPointer(); virtual void setCompactUnwindEncoding(uint64_t ehAtomAddress); @@ -320,19 +320,6 @@ ObjectFile::Reference* BaseAtom::getLSDA() return NULL; } -ObjectFile::Reference* BaseAtom::getFDE() -{ - const uint8_t groupKind = this->getLSDAReferenceKind(); - const std::vector& refs = this->getReferences(); - for (std::vector::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(); @@ -397,21 +384,36 @@ public: 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; @@ -439,7 +441,7 @@ public: 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& getReferences() const { return (std::vector&)(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 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); @@ -643,6 +646,12 @@ ObjectFile::Atom& SymbolAtom::getFollowOnAtom() const return *((ObjectFile::Atom*)NULL); } +template +bool SymbolAtom::isZeroFill() const +{ + return ( ((fSection->flags() & SECTION_TYPE) == S_ZEROFILL) && fOwner.fOptions.fOptimizeZeroFill ); +} + 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 unsigned int getSectionIndex() const { return fAliasOf.getSectionIndex(); } 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 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; } @@ -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 unsigned int getSectionIndex() const { return 0; } 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*)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 unsigned int getSectionIndex() const { return fSectionIndex; } 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; + unsigned int fSectionIndex; }; template @@ -959,7 +972,7 @@ AnonymousAtom::AnonymousAtom(Reader& owner, const macho_section

* 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), - fType(ObjectFile::Atom::kUnclassifiedType) + fType(ObjectFile::Atom::kUnclassifiedType), fSectionIndex(1 + (section - owner.fSectionsStart)) { fSegment = new Segment(fSection); fRedirect = this; @@ -1034,7 +1047,7 @@ AnonymousAtom::AnonymousAtom(Reader& owner, const macho_section

* sectio 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); @@ -1122,16 +1135,6 @@ AnonymousAtom::AnonymousAtom(Reader& owner, const macho_section

* sectio 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

* dummySection = new macho_section

(*fSection); - dummySection->set_segname("__DATA"); - dummySection->set_sectname("__nl_symbol_ptr"); - fSection = dummySection; - fSegment = new Segment(fSection); - } - fDontDeadStrip = false; fScope = ObjectFile::Atom::scopeLinkageUnit; uint32_t index = (fAddress - fSection->addr()) / sizeof(pint_t); @@ -1187,6 +1190,16 @@ AnonymousAtom::AnonymousAtom(Reader& owner, const macho_section

* sectio 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

* dummySection = new macho_section

(*fSection); + dummySection->set_segname("__DATA"); + dummySection->set_sectname("__nl_symbol_ptr"); + fSection = dummySection; + fSegment = new Segment(fSection); + } + if ( type == S_NON_LAZY_SYMBOL_POINTERS ) fKind = ObjectFile::Atom::kWeakDefinition; @@ -1213,13 +1226,6 @@ AnonymousAtom::AnonymousAtom(Reader& owner, const macho_section

* sectio template <> bool AnonymousAtom::cstringsHaveLabels() { return true; } template bool AnonymousAtom::cstringsHaveLabels() { return false; } -template -void AnonymousAtom::addLineInfo(const ObjectFile::LineInfo& info) -{ - // 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 void AnonymousAtom::resolveName() @@ -1324,7 +1330,7 @@ ObjectFile::Atom::Scope AnonymousAtom::getScope() const template bool AnonymousAtom::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 unsigned int getSectionIndex() const { return 0; } protected: typedef typename A::P P; @@ -1472,6 +1479,110 @@ AbsoluteAtom::AbsoluteAtom(Reader& owner, const macho_nlist

* symbol) } +// +// An SectionBoundaryAtom represent the start or end of a section +// +template +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& 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* 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; + + + 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&, bool start, const char* symbolName, const char* segSectName); + virtual ~SectionBoundaryAtom() {} + + Reader& fOwner; + class Segment* fSegment; + const char* fSymbolName; + const char* fSectionName; + const char* fDisplayName; + bool fStart; + static std::vector fgNoReferences; +}; + +template +std::vector SectionBoundaryAtom::fgNoReferences; + +// examples: +// section$start$__DATA$__my +// section$end$__DATA$__my +template +SectionBoundaryAtom::SectionBoundaryAtom(Reader& 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); - void buildRelocatedMap(const macho_section

* sect, std::map& map); Reader& fReader; const uint8_t* fMappingStart; const macho_section

* fSectionsStart; const macho_section

* fSectionsEnd; - std::map fEHFrameOffsetToTargetMap; }; @@ -1525,43 +1634,26 @@ const void* ObjectFileAddressSpace::mappedAddress(pint_t addr, pint_t* relocT fMappingStart = (uint8_t*)fReader.fHeader; fSectionsStart = (macho_section

*)((char*)fReader.fSegment + sizeof(macho_segment_command

)); 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

* ehSect = fReader.fehFrameSection; - if ( (ehSect->addr() <= addr) && (addr < (ehSect->addr()+ehSect->size())) ) { - pint_t offsetOfAddrInSection = addr - ehSect->addr(); - if ( relocTarget != NULL ) { - std::map::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

* 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

* 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; friend class TentativeAtom; friend class AbsoluteAtom; + friend class SectionBoundaryAtom; friend class SymbolAtom; typedef std::map 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); + AtomAndOffset findAtomAndOffsetForSection(pint_t addr, unsigned int sectionIndex); AtomAndOffset findAtomAndOffset(pint_t baseAddr, pint_t realAddr); Reference* makeReference(Kinds kind, pint_t atAddr, pint_t toAddr); Reference* makeReference(Kinds kind, pint_t atAddr, pint_t fromAddr, pint_t toAddr); @@ -1822,12 +1916,8 @@ Reader::Reader(const uint8_t* fileContent, const char* path, time_t modTime, for (const macho_section

* 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 >::getCFIs(fObjectAddressSpace, sect->addr(), - sect->size(), fFDEInfos, fCIEInfos); - if ( msg != NULL ) { - throwf("malformed __eh_frame section: %s", msg); - } - else { + if ( libunwind::CFI_Parser >::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::const_iterator it = fCIEInfos.begin(); it != fCIEInfos.end(); ++it) { @@ -1849,6 +1939,9 @@ Reader::Reader(const uint8_t* fileContent, const char* path, time_t modTime, } } } + else { + throw "malformed __eh_frame section"; + } } } @@ -1947,6 +2040,13 @@ Reader::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(*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(*this, true, symName, &symName[14])); + else if ( strncmp(symName, "section$end$", 12) == 0) + fAtoms.push_back(new SectionBoundaryAtom(*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 ) { @@ -2089,8 +2189,9 @@ Reader::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; - // 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(*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::getFunctionAtomFromLSDAAddress(pint_t addr) } -template <> -void ObjectFileAddressSpace::buildRelocatedMap(const macho_section

* sect, std::map& map) -{ - // mach-o x86_64 is different, the content of a section with a relocation is the addend - const macho_relocation_info

* relocs = (macho_relocation_info

*)((char*)(fReader.fHeader) + sect->reloff()); - const macho_relocation_info

* relocsEnd = &relocs[sect->nreloc()]; - for (const macho_relocation_info

* reloc = relocs; reloc < relocsEnd; ++reloc) { - std::map::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 -void ObjectFileAddressSpace::buildRelocatedMap(const macho_section

* sect, std::map& 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::relocated(uint32_t sectOffset, uint32_t relocsOffset, uint32_t relocsCount) @@ -3037,15 +3100,14 @@ uint32_t SymbolAtom::getCompactUnwindEncoding(uint64_t ehAtomAddress) { pint_t lsda; pint_t personality; - char warningBuffer[1024]; uint32_t result = libunwind::DwarfInstructions, 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 ) - 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; } @@ -3055,15 +3117,14 @@ uint32_t SymbolAtom::getCompactUnwindEncoding(uint64_t ehAtomAddress) { pint_t lsda; pint_t personality; - char warningBuffer[1024]; uint32_t result = libunwind::DwarfInstructions, 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 ) - 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; } @@ -3121,14 +3182,12 @@ uint32_t AnonymousAtom::getCompactUnwindEncoding(uint64_t ehAtomAddress) { pint_t lsda; pint_t personality; - char warningBuffer[1024]; uint32_t result = libunwind::DwarfInstructions, 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 ) 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::getCompactUnwindEncoding(uint64_t ehAtomAddress) { pint_t lsda; pint_t personality; - char warningBuffer[1024]; uint32_t result = libunwind::DwarfInstructions, 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 ) warning("can't make compact unwind encoding from dwarf for %s in %s", this->getDisplayName(), fOwner.getPath()); } return result; @@ -3464,8 +3521,11 @@ Reference* Reader::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()]; - if ( ((toSymbol->n_type() & N_TYPE) == N_SECT) && (((toSymbol->n_type() & N_EXT) == 0) || (symbolName[0] == 'L')) ) - return new Reference(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(kind, findAtomAndOffset(atAddr), targetAO); + } else return new Reference(kind, findAtomAndOffset(atAddr), symbolName, toOffset); } @@ -3492,6 +3552,29 @@ BaseAtom* Reader::makeReferenceToEH(const char* ehName, pint_t ehAtomAdd return NULL; } +template +AtomAndOffset Reader::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::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 AtomAndOffset Reader::findAtomAndOffset(pint_t addr) @@ -3528,10 +3611,9 @@ AtomAndOffset Reader::findAtomAndOffset(pint_t baseAddr, pint_t realAddr) 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::addRelocReference_powerpc(const macho_section* se makeByNameReference(A::kPointer, srcAddr, targetName, pointerValue); } else { - makeReference(A::kPointer, srcAddr, pointerValue); + new Reference(A::kPointer, findAtomAndOffset(srcAddr), findAtomAndOffsetForSection(pointerValue, reloc->r_symbolnum())); } } break; @@ -4411,9 +4493,8 @@ bool Reader::addRelocReference(const macho_section* sect, const mac 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]); @@ -4422,11 +4503,12 @@ bool Reader::addRelocReference(const macho_section* sect, const mac makeByNameReference(x86::kDtraceIsEnabledSite, srcAddr, targetName, 0); addDtraceExtraInfos(srcAddr, &targetName[20]); } - else if ( reloc->r_pcrel() && (atom->getSymbolTableInclusion() == ObjectFile::Atom::kSymbolTableNotIn) - && ((AnonymousAtom*)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*)targetAO.atom)->isWeakImportStub() ) + new Reference(x86::kPCRel32WeakImport, findAtomAndOffset(srcAddr), targetAO); else if ( reloc->r_symbolnum() != R_ABS ) - makeReference(kind, srcAddr, pointerValue); + new Reference(kind, findAtomAndOffset(srcAddr), targetAO); else { // find absolute symbol that corresponds to pointerValue AddrToAtomMap::iterator pos = fAddrToAbsoluteAtom.find(pointerValue); @@ -4583,10 +4665,7 @@ bool Reader::addRelocReference(const macho_section* sect, con 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)); @@ -4986,7 +5065,7 @@ bool Reader::addRelocReference(const macho_section* sect, } 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(kind, at, to); @@ -5198,7 +5277,7 @@ const char* Reference::getDescription() const 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)", @@ -5206,9 +5285,6 @@ const char* Reference::getDescription() const 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; @@ -5533,9 +5609,6 @@ const char* Reference::getDescription() const 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; diff --git a/src/ld/MachOWriterExecutable.hpp b/src/ld/MachOWriterExecutable.hpp index b019af2..9e02efa 100644 --- a/src/ld/MachOWriterExecutable.hpp +++ b/src/ld/MachOWriterExecutable.hpp @@ -453,7 +453,6 @@ private: std::vector fLocalSymbolAtoms; std::vector > fLocalExtraLabels; std::vector > fGlobalExtraLabels; - std::map fAtomToSymbolIndex; class SectionRelocationsLinkEditAtom* fSectionRelocationsAtom; class CompressedRebaseInfoLinkEditAtom* fCompressedRebaseInfoAtom; class CompressedBindingInfoLinkEditAtom* fCompressedBindingInfoAtom; @@ -973,20 +972,17 @@ public: 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::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 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 CompressedEncodingFixUp { uint8_t* contentPointer; ObjectFile::Atom* fde; }; - bool encodingMeansUseDwarf(compact_unwind_encoding_t encoding); void compressDuplicates(std::vector& uniqueInfos); void findCommonEncoding(const std::vector& uniqueInfos, std::map& commonEncodings); void makeLsdaIndex(const std::vector& uniqueInfos, std::map& lsdaIndexOffsetMap); @@ -1009,7 +1005,6 @@ private: std::vector fLSDAIndex; std::vector fRegFixUps; std::vector fCompressedFixUps; - std::vector fCompressedEncodingFixUps; std::vector fReferences; }; @@ -3240,8 +3235,6 @@ void Writer::setExportNlist(const ObjectFile::Atom* atom, macho_nlist

* ent 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; @@ -3326,14 +3319,8 @@ void Writer::setLocalNlist(const ObjectFile::Atom* atom, macho_nlist

* entr 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 - // 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)); @@ -3356,8 +3343,6 @@ void Writer::setLocalNlist(const ObjectFile::Atom* atom, macho_nlist

* entr // 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() ) @@ -3496,27 +3481,6 @@ void Writer::buildSymbolTable() // set up module table if ( fModuleInfoAtom != NULL ) fModuleInfoAtom->setName(); - - // create atom to symbol index map - // imports - int i = 0; - for(std::vector::iterator it=fImportedAtoms.begin(); it != fImportedAtoms.end(); ++it) { - fAtomToSymbolIndex[*it] = i + fSymbolTableImportStartIndex; - ++i; - } - // locals - i = 0; - for(std::vector::iterator it=fLocalSymbolAtoms.begin(); it != fLocalSymbolAtoms.end(); ++it) { - fAtomToSymbolIndex[*it] = i + fSymbolTableLocalStartIndex; - ++i; - } - // exports - i = 0; - for(std::vector::iterator it=fExportedAtoms.begin(); it != fExportedAtoms.end(); ++it) { - fAtomToSymbolIndex[*it] = i + fSymbolTableExportStartIndex; - ++i; - } - } @@ -3726,9 +3690,30 @@ void Writer::addStabs(uint32_t startIndex) template uint32_t Writer::symbolIndex(ObjectFile::Atom& atom) { - std::map::iterator pos = fAtomToSymbolIndex.find(&atom); - if ( pos != fAtomToSymbolIndex.end() ) - return pos->second; + // search imports + int i = 0; + for(std::vector::iterator it=fImportedAtoms.begin(); it != fImportedAtoms.end(); ++it) { + if ( &atom == *it ) + return i + fSymbolTableImportStartIndex; + ++i; + } + + // search locals + i = 0; + for(std::vector::iterator it=fLocalSymbolAtoms.begin(); it != fLocalSymbolAtoms.end(); ++it) { + if ( &atom == *it ) + return i + fSymbolTableLocalStartIndex; + ++i; + } + + // search exports + i = 0; + for(std::vector::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()); } @@ -3933,9 +3918,6 @@ uint32_t Writer::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::kSectionOffset24: - throw "internal linker error, kSectionOffset24 can't be encoded into object files"; - case x86_64::kDtraceTypeReference: case x86_64::kDtraceProbe: // generates no relocs @@ -4058,9 +4040,6 @@ uint32_t Writer::addObjectRelocs(ObjectFile::Atom* atom, ObjectFile::Refere 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 @@ -4759,6 +4738,14 @@ bool Writer::illegalRelocInFinalLinkedImage(const ObjectFile::Reference& template <> bool Writer::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: @@ -4772,7 +4759,7 @@ bool Writer::illegalRelocInFinalLinkedImage(const ObjectFile::Reference& re return true; case ObjectFile::Atom::kAbsoluteSymbol: // absolute symbbols only allowed in static executables - return ( fOptions.outputKind() != Options::kStaticExecutable); + return true; } } return false; @@ -5260,23 +5247,11 @@ void Writer::buildExecutableFixups() 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 - // 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); @@ -5345,16 +5320,6 @@ void Writer::buildExecutableFixups() 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()); @@ -6543,9 +6508,9 @@ void Writer::fixUpReferenceFinal(const ObjectFile::Reference* ref, const Ob break; } } - else if ( !fOptions.makeClassicDyldInfo() + else if ( fOptions.makeCompressedDyldInfo() && (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 { @@ -6579,15 +6544,6 @@ void Writer::fixUpReferenceFinal(const ObjectFile::Reference* ref, const Ob 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; @@ -6777,8 +6733,6 @@ void Writer::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"; - 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 @@ -6808,9 +6762,9 @@ void Writer::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 ( !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 { @@ -6879,15 +6833,6 @@ void Writer::fixUpReferenceFinal(const ObjectFile::Reference* ref, const 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 @@ -7105,8 +7050,6 @@ void Writer::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"; - 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 @@ -8310,12 +8253,12 @@ void Writer::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 ) - 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 ) { - 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::setSize(uint64_t newSize) template void UnwindInfoAtom::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; - if ( fdeRef != NULL ) - info.fde = &fdeRef->getTarget(); - else - info.fde = NULL; if ( lsdaRef != NULL ) { info.lsda = &lsdaRef->getTarget(); info.lsdaOffset = lsdaRef->getTargetOffset(); @@ -10069,24 +10007,6 @@ void UnwindInfoAtom::addUnwindInfo(ObjectFile::Atom* func, uint32_t offset, u // encoding, info.lsda, info.lsdaOffset, personalityPointer, func->getDisplayName()); } -template <> -bool UnwindInfoAtom::encodingMeansUseDwarf(compact_unwind_encoding_t encoding) -{ - return ( (encoding & UNWIND_X86_MODE_MASK) == UNWIND_X86_MODE_DWARF); -} - -template <> -bool UnwindInfoAtom::encodingMeansUseDwarf(compact_unwind_encoding_t encoding) -{ - return ( (encoding & UNWIND_X86_64_MODE_MASK) == UNWIND_X86_64_MODE_DWARF); -} - -template -bool UnwindInfoAtom::encodingMeansUseDwarf(compact_unwind_encoding_t encoding) -{ - return false; -} - template void UnwindInfoAtom::compressDuplicates(std::vector& uniqueInfos) @@ -10100,10 +10020,9 @@ void UnwindInfoAtom::compressDuplicates(std::vector& uniqueInfos) last.personalityPointer = NULL; last.encoding = 0xFFFFFFFF; for(typename std::vector::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 - 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); } @@ -10119,9 +10038,6 @@ void UnwindInfoAtom::findCommonEncoding(const std::vector& uniqueInfos, std::map encodingsUsed; unsigned int mostCommonEncodingUsageCount = 0; for(typename std::vector::const_iterator it=uniqueInfos.begin(); it != uniqueInfos.end(); ++it) { - // never put dwarf into common table - if ( encodingMeansUseDwarf(it->encoding) ) - continue; std::map::iterator pos = encodingsUsed.find(it->encoding); if ( pos == encodingsUsed.end() ) { encodingsUsed[it->encoding] = 1; @@ -10197,8 +10113,7 @@ unsigned int UnwindInfoAtom::makeRegularSecondLevelPage(const std::vector::makeCompressedSecondLevelPage(const std::vector< 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 @@ -10235,20 +10149,14 @@ unsigned int UnwindInfoAtom::makeCompressedSecondLevelPage(const std::vector< 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::iterator ppos = pageSpecificEncodings.find(encoding); + std::map::iterator ppos = pageSpecificEncodings.find(info.encoding); 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) @@ -10270,72 +10178,52 @@ unsigned int UnwindInfoAtom::makeCompressedSecondLevelPage(const std::vector< ++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); } - //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); - 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 - uint8_t* pageStart = pageEnd - compressPageUsed - pad; + uint8_t* pageStart = pageEnd - compressPageUsed; macho_unwind_info_compressed_second_level_page_header

* page = (macho_unwind_info_compressed_second_level_page_header

*)pageStart; page->set_kind(UNWIND_SECOND_LEVEL_COMPRESSED); page->set_entryPageOffset(sizeof(macho_unwind_info_compressed_second_level_page_header

)); 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; - if ( encodingMeansUseDwarf(info.encoding) ) { - // dwarf entries are always in page specific encodings - encodingIndex = pageSpecificEncodings[info.encoding+i]; - } - else { - std::map::const_iterator pos = commonEncodings.find(info.encoding); - if ( pos != commonEncodings.end() ) - encodingIndex = pos->second; - else - encodingIndex = pageSpecificEncodings[info.encoding]; - } + std::map::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); - 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 - for(std::map::const_iterator it = pageSpecificEncodings.begin(); it != pageSpecificEncodings.end(); ++it) { + uint32_t* const encodingsArray = (uint32_t*)&pageStart[page->encodingsPageOffset()]; + for(std::map::iterator it = pageSpecificEncodings.begin(); it != pageSpecificEncodings.end(); ++it) { A::P::E::set32(encodingsArray[it->second-commonEncodings.size()], it->first); } @@ -10383,8 +10271,8 @@ void UnwindInfoAtom::generate() 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; @@ -10478,18 +10366,12 @@ void UnwindInfoAtom::generate() for (typename std::vector::iterator it = fRegFixUps.begin(); it != fRegFixUps.end(); ++it) { uint32_t offset = (it->contentPointer - fPagesContent) + fHeaderSize; fReferences.push_back(new WriterReference(offset, A::kImageOffset32, it->func)); - if ( it->fde != NULL ) - fReferences.push_back(new WriterReference(offset+4, A::kSectionOffset24, it->fde)); } // make references for compressed second level entries for (typename std::vector::iterator it = fCompressedFixUps.begin(); it != fCompressedFixUps.end(); ++it) { uint32_t offset = (it->contentPointer - fPagesContent) + fHeaderSize; fReferences.push_back(new WriterReference(offset, A::kPointerDiff24, it->func, 0, it->fromFunc, 0)); } - for (typename std::vector::iterator it = fCompressedEncodingFixUps.begin(); it != fCompressedEncodingFixUps.end(); ++it) { - uint32_t offset = (it->contentPointer - fPagesContent) + fHeaderSize; - fReferences.push_back(new WriterReference(offset, A::kSectionOffset24, it->fde)); - } // update section record with new size unwindSectionInfo->fSize = this->getSize(); @@ -11236,7 +11118,7 @@ void CompressedBindingInfoLinkEditAtom::encode() std::vector 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); @@ -11340,12 +11222,10 @@ void CompressedBindingInfoLinkEditAtom::encode() 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; + // convert to compressed encoding const static bool log = false; fEncodedData.reserve(info.size()*2); diff --git a/src/ld/ObjectFile.h b/src/ld/ObjectFile.h index 8b9a2d3..87396fb 100644 --- a/src/ld/ObjectFile.h +++ b/src/ld/ObjectFile.h @@ -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), - fAddCompactUnwindEncoding(true), + fAddCompactUnwindEncoding(false), 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) {} @@ -102,6 +103,7 @@ public: bool fRemoveDwarfUnwindIfCompactExists; bool fMakeCompressedDyldInfo; bool fAutoOrderInitializers; + bool fOptimizeZeroFill; 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 }; - 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; @@ -308,7 +310,6 @@ public: 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; } diff --git a/src/ld/Options.cpp b/src/ld/Options.cpp index 03969cd..58bb74c 100644 --- a/src/ld/Options.cpp +++ b/src/ld/Options.cpp @@ -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), - 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); @@ -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, "-no_zero_fill_sections") == 0 ) { + fReaderOptions.fOptimizeZeroFill = false; + } 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; + } void Options::reconfigureDefaults() @@ -3064,7 +3069,7 @@ void Options::reconfigureDefaults() 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 ) @@ -3125,6 +3130,11 @@ void Options::reconfigureDefaults() // 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() @@ -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"); + } + } } diff --git a/src/ld/ld.cpp b/src/ld/ld.cpp index ded2a19..6d93c0b 100644 --- a/src/ld/ld.cpp +++ b/src/ld/ld.cpp @@ -1,5 +1,5 @@ /* -*- 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@ * @@ -86,11 +86,11 @@ 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: - 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); @@ -101,9 +101,10 @@ private: typedef __gnu_cxx::hash_map, CStringEquals> NameToSection; //typedef std::map NameToSection; - char fSectionName[18]; - char fSegmentName[18]; + const char* fSectionName; + const char* fSegmentName; bool fZeroFill; + bool fUntrustedZeroFill; static NameToSection fgMapping; static std::vector fgSections; @@ -114,12 +115,9 @@ Section::NameToSection Section::fgMapping; std::vector 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 ) { @@ -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()); } -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() ) { - 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; + } // otherwise same section name is used in different segments, look slow way for (std::vector::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 - 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 - find("__StaticInit", "__TEXT", false); + find("__StaticInit", "__TEXT", false, true); } // remember segment discovery order @@ -658,7 +661,7 @@ void Linker::optimize() for(std::vector::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 @@ -871,8 +874,17 @@ inline void Linker::addAtom(ObjectFile::Atom& atom) } // 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 - Section* hugeZeroFills = Section::find("__huge", "__DATA", true); + Section* hugeZeroFills = Section::find("__huge", "__DATA", true, true); for (std::vector::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 - 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::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); - Section* dataSection = Section::find("__data", "__DATA", false, false); + Section* dataSection = Section::find("__data", "__DATA", false, true, false); if ( dataSection != NULL ) { for (std::vector::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); + + // 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 ) { @@ -4019,6 +4037,12 @@ bool Linker::AtomSorter::operator()(const ObjectFile::Atom* left, const ObjectFi 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); diff --git a/src/other/dyldinfo.cpp b/src/other/dyldinfo.cpp index 016fda3..4af50ff 100644 --- a/src/other/dyldinfo.cpp +++ b/src/other/dyldinfo.cpp @@ -722,7 +722,7 @@ void DyldInfoPrinter::printBindingInfo() } 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()]; @@ -738,7 +738,6 @@ void DyldInfoPrinter::printBindingInfo() 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; @@ -771,10 +770,6 @@ void DyldInfoPrinter::printBindingInfo() 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; @@ -793,22 +788,22 @@ void DyldInfoPrinter::printBindingInfo() 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: - 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: - 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) { - 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; diff --git a/src/other/unwinddump.cpp b/src/other/unwinddump.cpp index 098d932..d8d699d 100644 --- a/src/other/unwinddump.cpp +++ b/src/other/unwinddump.cpp @@ -83,7 +83,6 @@ private: 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

* fHeader; @@ -252,7 +251,7 @@ const char* UnwindPrinter::functionName(pint_t addr) } } } - return "--anonymous function--"; + return "??"; } @@ -289,379 +288,8 @@ bool UnwindPrinter::findUnwindSection() return false; } -#define EXTRACT_BITS(value, mask) \ - ( (value >> __builtin_ctz(mask)) & (((1 << __builtin_popcount(mask)))-1) ) -template <> -void UnwindPrinter::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::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 -void UnwindPrinter::decode(uint32_t encoding, const uint8_t* funcStart, char* str) -{ - - -} template void UnwindPrinter::printUnwindSection() @@ -681,7 +309,7 @@ void UnwindPrinter::printUnwindSection() printf("\tcommon encodings: (count=%u)\n", sectionHeader->commonEncodingsArrayCount()); const uint32_t* commonEncodings = (uint32_t*)§ionContent[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*)§ionContent[sectionHeader->personalityArraySectionOffset()]; @@ -715,10 +343,10 @@ void UnwindPrinter::printUnwindSection() printf("\t\tentryCount=0x%08X\n", page->entryCount()); const macho_unwind_info_regular_second_level_entry

* entry = (macho_unwind_info_regular_second_level_entry

*)((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; + uint32_t funcOffset = entry[j].functionOffset(); for (uint32_t k=0; k < lsdaIndexArrayCount; ++k) { if ( lindex[k].functionOffset() == funcOffset ) { found = true; @@ -729,10 +357,8 @@ void UnwindPrinter::printUnwindSection() 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 ) { @@ -752,9 +378,7 @@ void UnwindPrinter::printUnwindSection() 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; - 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 @@ -769,8 +393,8 @@ void UnwindPrinter::printUnwindSection() 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 { diff --git a/unit-tests/run-all-unit-tests b/unit-tests/run-all-unit-tests index fa96968..842ce77 100755 --- a/unit-tests/run-all-unit-tests +++ b/unit-tests/run-all-unit-tests @@ -19,8 +19,6 @@ valid_archs="x86_64 armv6 ppc i386 " ../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 "" 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 index 72f365b..0000000 --- a/unit-tests/test-cases/coalesce_weak_def_in_dylib/Makefile +++ /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 index 1906d16..0000000 --- a/unit-tests/test-cases/coalesce_weak_def_in_dylib/foo.c +++ /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 index afd696d..0000000 --- a/unit-tests/test-cases/coalesce_weak_def_in_dylib/main.c +++ /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/custom.s b/unit-tests/test-cases/cstring-alt-segment/custom.s deleted file mode 100644 index 33705e5..0000000 --- a/unit-tests/test-cases/cstring-alt-segment/custom.s +++ /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 index 8fe18db..0000000 --- a/unit-tests/test-cases/cstring-alt-segment/main.c +++ /dev/null @@ -1,7 +0,0 @@ -#include - -int main() -{ - printf("hello"); - return 0; -} diff --git a/unit-tests/test-cases/cstring-labels/foo.c b/unit-tests/test-cases/cstring-labels/foo.c index 0780b62..efed306 100644 --- a/unit-tests/test-cases/cstring-labels/foo.c +++ b/unit-tests/test-cases/cstring-labels/foo.c @@ -1,6 +1,4 @@ -void func() {} - 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 index e60513e..0000000 --- a/unit-tests/test-cases/dead_strip-r_symbol_desc/Makefile +++ /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-weak-coalesce/baz.c b/unit-tests/test-cases/dead_strip-weak-coalesce/baz.c deleted file mode 100644 index 7d76bdd..0000000 --- a/unit-tests/test-cases/dead_strip-weak-coalesce/baz.c +++ /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 index 4cd4cfb..0000000 --- a/unit-tests/test-cases/dead_strip-weak-coalesce/foo.c +++ /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 index e4c564c..0000000 --- a/unit-tests/test-cases/dead_strip-weak-coalesce/main.c +++ /dev/null @@ -1,13 +0,0 @@ - -// baz is in a lazily loaded archive -extern void baz(); - -int main() -{ - baz(); - return 0; -} - - -#include "foo.c" - diff --git a/unit-tests/test-cases/eh-coalescing-no-labels/Makefile b/unit-tests/test-cases/eh-coalescing-no-labels/Makefile index 27cd180..8ce50d6 100644 --- a/unit-tests/test-cases/eh-coalescing-no-labels/Makefile +++ b/unit-tests/test-cases/eh-coalescing-no-labels/Makefile @@ -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 - ${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 diff --git a/unit-tests/test-cases/init-order/Makefile b/unit-tests/test-cases/init-order/Makefile index 7e8c6e1..bb67908 100644 --- a/unit-tests/test-cases/init-order/Makefile +++ b/unit-tests/test-cases/init-order/Makefile @@ -33,8 +33,8 @@ include ${TESTROOT}/include/common.makefile 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 diff --git a/unit-tests/test-cases/init-order/expected-order.txt b/unit-tests/test-cases/init-order/expected-order.txt index 9a303d3..1de60f3 100644 --- a/unit-tests/test-cases/init-order/expected-order.txt +++ b/unit-tests/test-cases/init-order/expected-order.txt @@ -8,6 +8,8 @@ Bar::Bar() __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() diff --git a/unit-tests/test-cases/kext-basic/Makefile b/unit-tests/test-cases/kext-basic/Makefile index d233171..6a318b3 100644 --- a/unit-tests/test-cases/kext-basic/Makefile +++ b/unit-tests/test-cases/kext-basic/Makefile @@ -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} + otool -rv mykext | grep '_OSRuntimeFinalizeCPP' | ${FAIL_IF_EMPTY} ${PASS_IFF} true clean: diff --git a/unit-tests/test-cases/no-data-bundle/Makefile b/unit-tests/test-cases/label-on-end-of-section/Makefile similarity index 82% rename from unit-tests/test-cases/no-data-bundle/Makefile rename to unit-tests/test-cases/label-on-end-of-section/Makefile index e1417fd..a6f1537 100644 --- a/unit-tests/test-cases/no-data-bundle/Makefile +++ b/unit-tests/test-cases/label-on-end-of-section/Makefile @@ -24,15 +24,14 @@ TESTROOT = ../.. include ${TESTROOT}/include/common.makefile # -# Check that a bundle built with no data links -# gcc DejaGnu failure: building longcall/dylib library +# Check that ld handles labels at the end of a section # run: all all: - ${CC} ${CCFLAGS} foo.c -bundle -o foo.bundle - ${PASS_IFF_GOOD_MACHO} foo.bundle + ${CC} ${CCFLAGS} foo.s -c -o foo.o + ${OBJECTDUMP} foo.o | grep "pointer to _end" | ${PASS_IFF_STDIN} clean: - rm foo.bundle + 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 index 0000000..9544a76 --- /dev/null +++ b/unit-tests/test-cases/label-on-end-of-section/foo.s @@ -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/foo.c b/unit-tests/test-cases/no-data-bundle/foo.c deleted file mode 100644 index 5cb3e31..0000000 --- a/unit-tests/test-cases/no-data-bundle/foo.c +++ /dev/null @@ -1,6 +0,0 @@ -#include - -void foo() -{ - rand(); -} \ No newline at end of file diff --git a/unit-tests/test-cases/dead_strip-weak-coalesce/Makefile b/unit-tests/test-cases/no_zero_fill_sections/Makefile similarity index 70% rename from unit-tests/test-cases/dead_strip-weak-coalesce/Makefile rename to unit-tests/test-cases/no_zero_fill_sections/Makefile index 45886c0..8db13a7 100644 --- a/unit-tests/test-cases/dead_strip-weak-coalesce/Makefile +++ b/unit-tests/test-cases/no_zero_fill_sections/Makefile @@ -1,5 +1,5 @@ ## -# Copyright (c) 2009 Apple Inc. All rights reserved. +# Copyright (c) 2005 Apple Computer, Inc. All rights reserved. # # @APPLE_LICENSE_HEADER_START@ # @@ -24,18 +24,16 @@ TESTROOT = ../.. include ${TESTROOT}/include/common.makefile # -# Check that symbols in no-dead-strip sections can be coalesced. -# -dead_strip inhibits weak coalescing in no_dead_strip section +# Check that the -no_zero_fill_sections works # 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} + ${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 -rf main baz.o libbaz.a + rm main diff --git a/unit-tests/test-cases/dead_strip-r_symbol_desc/main.c b/unit-tests/test-cases/no_zero_fill_sections/main.c similarity index 90% rename from unit-tests/test-cases/dead_strip-r_symbol_desc/main.c rename to unit-tests/test-cases/no_zero_fill_sections/main.c index 7e206e5..a04a2ca 100644 --- a/unit-tests/test-cases/dead_strip-r_symbol_desc/main.c +++ b/unit-tests/test-cases/no_zero_fill_sections/main.c @@ -21,21 +21,14 @@ * * @APPLE_LICENSE_HEADER_END@ */ +#include - -__attribute__((used)) static void foo() -{ -} - - -__attribute__((used)) void bar() -{ -} - +static int a[2000]; +int b[2000]; int main() { - foo(); - bar(); + 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 index 76a7347..0000000 --- a/unit-tests/test-cases/objc-literal-pointers-strip/Makefile +++ /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 -# 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/operator-new/Makefile b/unit-tests/test-cases/operator-new/Makefile index 447ee87..8abf3e1 100644 --- a/unit-tests/test-cases/operator-new/Makefile +++ b/unit-tests/test-cases/operator-new/Makefile @@ -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@ # @@ -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 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} diff --git a/unit-tests/test-cases/operator-new/main.cxx b/unit-tests/test-cases/operator-new/main.cxx index b5d3272..3c99e35 100644 --- a/unit-tests/test-cases/operator-new/main.cxx +++ b/unit-tests/test-cases/operator-new/main.cxx @@ -36,7 +36,7 @@ #if OP_NEW void* operator new(size_t s) throw (std::bad_alloc) { - return malloc(s); + return malloc(s);; } #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 index fdb13d5..0000000 --- a/unit-tests/test-cases/re-export-optimizations-indirect/Makefile +++ /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 index 9c18401..0000000 --- a/unit-tests/test-cases/re-export-optimizations-indirect/bar.c +++ /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 index d0cdf47..0000000 --- a/unit-tests/test-cases/re-export-optimizations-indirect/foo.c +++ /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 index 672ef9a..0000000 --- a/unit-tests/test-cases/re-export-optimizations-indirect/main.c +++ /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 index d3578a6..0000000 --- a/unit-tests/test-cases/re-export-optimizations-indirect/middle.c +++ /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 index 0cd6dda..0000000 --- a/unit-tests/test-cases/re-export-optimizations-indirect/other.c +++ /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 index 36fb47b..0000000 --- a/unit-tests/test-cases/relocs-neg-from-local/Makefile +++ /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 - -# -# 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 index 3890f35..0000000 --- a/unit-tests/test-cases/relocs-neg-from-local/test.s +++ /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/cstring-alt-segment/Makefile b/unit-tests/test-cases/section-labels/Makefile similarity index 80% rename from unit-tests/test-cases/cstring-alt-segment/Makefile rename to unit-tests/test-cases/section-labels/Makefile index 4e55304..d783b16 100644 --- a/unit-tests/test-cases/cstring-alt-segment/Makefile +++ b/unit-tests/test-cases/section-labels/Makefile @@ -24,16 +24,14 @@ TESTROOT = ../.. include ${TESTROOT}/include/common.makefile # -# Check that __cstring sections in other segments are not coalesced -# ld coalesces C strings in different segments +# Check that ld resolves the magic section start/end symbols. # run: all all: - ${CC} ${CCFLAGS} main.c custom.s -o main - size -l main | grep __cstring | wc -l | grep 2 | ${FAIL_IF_EMPTY} + ${CC} ${CCFLAGS} main.c -o main ${PASS_IFF_GOOD_MACHO} main clean: - rm main + rm main diff --git a/unit-tests/test-cases/objc-literal-pointers-strip/test.m b/unit-tests/test-cases/section-labels/main.c similarity index 71% rename from unit-tests/test-cases/objc-literal-pointers-strip/test.m rename to unit-tests/test-cases/section-labels/main.c index 4837911..a8c4bfa 100644 --- a/unit-tests/test-cases/objc-literal-pointers-strip/test.m +++ b/unit-tests/test-cases/section-labels/main.c @@ -21,26 +21,22 @@ * * @APPLE_LICENSE_HEADER_END@ */ - - #include -#include -@interface Foo @end -@implementation Foo -+(void)initialize { } -+(void)foo { - fprintf(stderr, "GOOD\n"); - exit(0); -} -+(void)bar { - fprintf(stderr, "BAD\n"); - abort(); -} -@end +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"); + -void PublicFunction(void) +int main() { - [Foo foo]; - [Foo bar]; -} + 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 index f31d9d6..0000000 --- a/unit-tests/test-cases/section-names-long/Makefile +++ /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 -# 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 index d7e5847..0000000 --- a/unit-tests/test-cases/section-names-long/a.s +++ /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 index a31d414..0000000 --- a/unit-tests/test-cases/section-names-long/b.s +++ /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 index 383b159..0000000 --- a/unit-tests/test-cases/section-names-long/c.s +++ /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 index df77448..0000000 --- a/unit-tests/test-cases/section-names-long/main.c +++ /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 index cd6dc04..0000000 --- a/unit-tests/test-cases/shared-cache-dylib/Makefile +++ /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 index 6924ac6..0000000 --- a/unit-tests/test-cases/shared-cache-dylib/foo.c +++ /dev/null @@ -1,3 +0,0 @@ - -void foo() {} - diff --git a/unit-tests/test-cases/stripped-indirect-symbol-table/Makefile b/unit-tests/test-cases/stripped-indirect-symbol-table/Makefile index fcb7e7d..c0647b3 100644 --- a/unit-tests/test-cases/stripped-indirect-symbol-table/Makefile +++ b/unit-tests/test-cases/stripped-indirect-symbol-table/Makefile @@ -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@ # @@ -23,14 +23,18 @@ 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. -# And for i386 that there are no __IMPORT/__pointers left # 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 - size -l dylib1 | grep __IMPORT | ${FAIL_IF_STDIN} - size -l dylib2 | grep __IMPORT | ${FAIL_IF_STDIN} ${PASS_IFF} diff dylib1.pointers dylib2.pointers clean: diff --git a/unit-tests/test-cases/weak_import/Makefile b/unit-tests/test-cases/weak_import/Makefile index cdacfc9..d1fa1f3 100644 --- a/unit-tests/test-cases/weak_import/Makefile +++ b/unit-tests/test-cases/weak_import/Makefile @@ -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} 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 @@ -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 _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} - ${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 @@ -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 - #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: -- 2.45.2