To Do: - Add the -prebind_allow_overlap and -prebind_all_two_level_modules to libtool see Radar bug 3417137. - Change to Doug's approach to relayout, namely something like reserving the last 10% of the load region for new dylibs and then evenly spacing the existing dylibs in the other 90% (for split libs). See email of 11/6/2000. - Have cmpdylib check Objc info Tracker bug #78124. - Fix a bug in strip on line 1105 where it uses missing_reloc_symbols when it could have been set otherwise and does not print the next line. - Maybe add fat support for segedit(1) Changes for the 5.33 release (the cctools-845 release): - Changed strip(1) to use libc++ instead of libstdc++ . Radar bug #13470497. Changes for the 5.33 release (the cctools-842 release): - Changed lipo(1) to use a temporary file for its output and do a final rename(2) to make it atomically create the output file. The changes were in create_fat() in lipo.c . Radar bug #13045167. - Fixed a bug in install_name_tool(1) when more than one -add_rpath options are used. Radar bug #13012481. - Changed lipo(1) so it uses 16k pages for ARM binaries. Radar bug #13080176. Changes for the 5.33 release (the cctools-840 release): - Added support for new archs: armv6m / armv7m / armv7em and updated lipo.c . Radar bug #11314463. - Tried to changed to use libc++ instead of libstdc++ but libprunetrie.a needs to be changed first. For now this is line in the Makefile: #CXXLIB = -stdlib=libc++ is commented out which is the needed change. Radar bug #12624622. Changes for the 5.33 release (the cctools-839 release): - Changed the Makefile so that strip(1)'s use of and libprunetrie.a so that it comes from DT_TOOLCHAIN_DIR. Radar bug #12296255. Changes for the 5.32 release (the cctools-835 release): - Fixed a bug in strip(1) when the input was a .o file containg LC_FUNCTION_STARTS load command. The code in get_starting_syminfo_offset() in strip.c did not look for the load command which can be the start of the symbolic offset in the file. Radar bug #11913911. Changes for the 5.32 release (the cctools-833 release): - Changed strip(1) to always use ld -r on ARM .o files to rename thumb symbols so they don't get stripped. Radar bug #11795809. Changes for the 5.32 release (the cctools-830 release): - Fixed a bug in nmedit(1) when the input was a .o file containg a LC_DATA_IN_CODE load command. The code in get_starting_syminfo_offset() in strip.c did not look for the load command which can be the start of the symbolic offset in the file. Radar bug #11554503. - Fixed a bug in libtool(1) when run as ranlib(1) to not update the table of contents if the input archive's table of content's member name is not using the extended long name format and we create an table of contents with a extended long name format (or vice a versa). Radar bug #10399314. Changes for the 5.31 release (the cctools-827 release): - Added #ifdef guards for LTO_SUPPORT in lipo.c . Radar bug #11296366. Changes for the 5.31 release (the cctools-825 release): - Fixed the full strip case with -no_uuid that was not stripping the LC_UUID load command. A call to strip_LC_UUID_commands() was added to strip_object() in strip.c for the full strip case. Radar bug #11136733. Changes for the 5.31 release (the cctools-824 release): - Removed the creation of the link to /usr/local/bin/nmedit from $(DSTROOT)$(LOCBINDIR)/nmedit in the Makefile. Radar bug #10688477. - Fixed a bunch of places in libtool(1) that was using 32-bit variables to hold offsets and sizes. Radar bug #10645295. Changes for the 5.30 release (the cctools-822 release): - The "low risk fix to strip(1)" below in cctools-821 for Radar bug #10718585 breaks striping .o files with dwarf debug info. Because the input file has an "ld -r" run on it so it is not the original input file. That change has been backed out. - The correct fix for strip(1) in dealing with code signed binaries is to added up the sizes of the output and input parts in the right order. So the code in strip_object() has been updated to do this. Radar bug #10709632. Changes for the 5.30 release (the cctools-821 release): - Made a low risk fix to strip(1) to fix bugs when stripping objects with code signature data. The problem is that the code in strip_object() that is calculating object->input_sym_info_size is incorrect as it is not adding the elements up in their order and rounding the size for elements that are aligned like the code signature info. So as a low risk fix code was added in dyld_order() in checkout.c in libstuff that records the size of the symbolic information. Then in strip_object() it simply overwrites the previously incorrectly calculated value for object->input_sym_info_size with that. Radar bug #10718585. - Fixed a bug in codesign_allocate(1) that was incorrectly using the value of sizeof(struct mach_header) for a 64-bit binary when testing if there was enough room to add the load command. Radar bug #10652697. - Updated the code in pagestuff(1) to have parts for the dyld info and correctly handle dylib stubs who's section contents do not appear in the binary. Changes for the 5.30 release (the cctools-820 release): - Removed the use of vers_string(1) from the Makefile. Radar bug #10596469. - Updated libtool.c to print "Apple Inc." not "Apple Computer, Inc." and the comment where apple_version[] comes from. - Added a reference to apple_version[] in checksyms.c, cmpdylib.c, lipo.c, size.c, strings.c, nm.c, redo_prebinding.c, seg_addr_table.c, check_dylib.c codesign_allocate.c, ctf_insert.c, seg_hack.c, install_name_tool.c, indr.c, strip.c and pagestuff.c. Changes for the 5.30 release (the cctools-818 release): - Fixed strip(1) to account for the size of the function starts data when the binary does not have a dynamic symbol table command. It should have conditionalized on having a dynamic symbol table command but just the load command that has the data. Radar bug #10506809. Changes for the 5.30 release (the cctools-816 release): - Changed ctf_insert(1) to allow a static binary with a dynamic symbol table load command that has local relocation entries. Radar bug #10405248. Changes for the 5.30 release (the cctools-815 release): - Added the os_tools_install target in the Makefile that only builds lipo(1) and strings(1). Radar bug #10391158. Changes for the 5.30 release (the cctools-814 release): - Changed strip(1) to use "ld -r" on 32-bit objects now that the blocking bug in ld(1) is fixed. Radar bug #7076828. - Added support for new load commands LC_MAIN, LC_DATA_IN_CODE, LC_SOURCE_VERSION and LC_DYLIB_CODE_SIGN_DRS. - Updated install_name_tool.c, pagestuff.c, redo_prebinding.c, strip.c, codesign_allocate.c, ctf_insert.c, indr.c and inout.c . Radar bug #10290817. - Fixed ctf_insert(1) to correctly handle the LC_FUNCTION_STARTS load command and update it and move its data. Radar bug #10171548. Changes for the 5.30 release (the cctools-811 release): - Changed the Makefile setting CXX to use c++ not g++. Radar bug #10057952. Changes for the 5.30 release (the cctools-809 release): - Changed lipo(1) to determine the architecture of bitcode files, including as archive members. Radar bug #9087924. Changes for the 5.30 release (the cctools-808 release): - Fixed a bug in create_library() in the loop that adjusted the ranlib structs ran_off was using the incorrect index value for: archs[0].toc_ranlibs[i].ran_off = archs[0].members[i].input_member_offset; which should have been: archs[0].toc_ranlibs[i].ran_off = archs[0].members[j].input_member_offset; Radar bug #9830754. Changes for the 5.29 release (the cctools-805 release): - Changed create_library() in libtool.c to check the new ofile bad_toc field and cause it to create a new library when this happens. Radar bug #9475790. Changes for the 5.29 release (the cctools-803 release): - Changed libtool.c when running as ranlib(1) to attempt to update the table of contents in place for the common case for thin archives. And removed the the time stamp checking for the "nop" ranlib case, which now ends up with just "touching" the file and adjusting the timestamps. Radar bug #9354605. - Factored out existing code into new routines get_target_byte_sex() and put_toc_member(). - Changed process() and removed the time stamp checking for the "nop" ranlib case. - Added the input_member_offset field to the struct member and added code to set its value in add_member(). - Changed create_library() to take an ofile which is non-NULL if run as ranlib(1) and a thin archive. - Added code in create_library() to update the table of contents in place. And code to only "touch", write the SARMAG, if the table of contents is the same. This code has to use the input_member_offset in cases that the thin input archive would not be same as produced by libtool(1) but still has member offsets at acceptable alignments. Changes for the 5.29 release (the cctools-802 release): - Fixed a problem with the change to libtool(1) for Radar bug #9354501. It was not setting toc_uptodate to TRUE and was not doing this only when cmd_flags.ranlib == TRUE. Radar bug #9418154. Changes for the 5.29 release (the cctools-801 release): - Changed process() in libtool.c to check that the table of contents was up to date based on the file's time stamp and the table of contents time stamp for archive files. Then if it ranlib(1) being run do nothing if it is up to date. Radar bug #9354501. - Fixed a bug in the error handling of pagestuff(1) when used with the -arch argument but missing an argument for which page. Radar bug #8979851. Changes for the 5.29 release (the cctools-800.3 release): - Added support for armv7[fsk] to print_arch() in lipo.c . Radar bug #8987684. Changes for the 5.28 release (the cctools-798 release): - Added this line to the Makefile: CXX = $(shell xcrun -find -sdk $(SDKROOT) g++) so that it uses the appropriate tool to link device-side code. Radar bug #8684965. Changes for the 5.28 release (the cctools-797 release): - Added support for LC_DYLD_ENVIRONMENT in segedit.c . Radar bug #8653976. Changes for the 5.28 release (the cctools-796 release): - Added checks in strings(1) to better protect against crashes if it is handed a malformed file. Radar bug #8599283. - Added the -arch option to pagestuff(1). Radar bug #8379048. Changes for the 5.28 release (the cctools-795 release): - Changed ctf_insert(1) to allow the LC_FUNCTION_STARTS load command. The change was in ctf_insert() in ctf_insert.c to remove the test for object->func_starts_info_cmd != NULL . Radar bug #8490836. Changes for the 5.28 release (the cctools-793 release): - Fixed a problem in nm(1) not checking that a symbol is not undefined before checking that is a [symbol resolver] symbol. Radar bug #8429570. Changes for the 5.28 release (the cctools-792 release): - Fixed more problems with incorrect support for LC_FUNCTION_STARTS. There were missing output_func_start_info_data and output_func_start_info_data_size fields in the struct object that should have been used. Updated the code in codesign_allocate.c, indr.c, inout.c, install_name_tool.c, redo_prebinding.c and strip.c which was incorrectly using output_split_info_data and output_split_info_data_size two use the new fields. Radar bug #8401082. Changes for the 5.28 release (the cctools-790 release): - Fixed problems with the incorrect support for LC_FUNCTION_STARTS. Radar bug #8274584. - Updated setup_code_signature() and setup_code_signature() in codesign_allocate.c . - Updated ctf_insert() in ctf_insert.c to treat objects with function starts info as an error and not allowed for static binaries. - Updated translate_dylib() in indr.c . - Updated setup_object_symbolic_info() in inout.c . - Updated setup_object_symbolic_info() and update_load_commands() in install_name_tool.c . - Updated build_new_symbol_table() in and update_load_commands() in redo_prebinding.c . - Updated strip_object(), strip_LC_UUID_commands() and strip_LC_CODE_SIGNATURE_commands() in strip.c Changes for the 5.28 release (the cctools-787 release): - Changed libtool(1) and added testing the environment variable ZERO_AR_DATE to set the ar date to zero to allow testing and comparing things for exact binary equality. Radar bug #7919021. - Changed lipo(1) to attempt to stop a crash if the file can't be paged in after it has been successfully mapped. Added a second fstat(2) call in process_input_file(1) just before the first bytes of the mapped file are referenced, and then checked that it has the same size and mod time of the first stat. Radar bug #8087586. - Added support in nm(1) for symbols marked with N_SYMBOL_RESOLVER so that they are printed with [symbol resolver]. This change is in print_mach_symbols() in nm.c . Radar bug #7901954. Changes for the 5.28 release (the cctools-784 release): - Fixed the -arch_only flag in libtool(1) for arm so that each subtype is treated as separate architecture. Radar bug #7864127. Changes for the 5.28 release (the cctools-782 release): - Added the -U option to nm(1) to not print undefined symbols. Radar bug #7761111. - Changed nm(1)'s -m printing to support 'weak symbol automatically hidden' in print_mach_symbols() in nm.c. Radar bug #5021217. Changes for the 5.28 release (the cctools-781 release): - Changed codesign_allocate(1) to allow it to be used on any Mach-O file. Radar bug #7689781. - Added the program ctf_insert(1) to add a (__CTF,__ctf) section to a statically linked Mach-O file. Radar bug #7016839. - Added support for LC_LOAD_UPWARD_DYLIB in update_load_commands() in install_name_tool.c, in nm() in nm.c and in replace_sections() in segedit.c . Radar bug #7659206. Changes for the 5.28 release (the cctools-780 release): - Changed trunc() to trnc() in libtool.c and removed -fno-builtin-trunc from the Makefile. - Improved the error checking in the redo_prebinding code so that contents_pointer_for_vmaddr() checks to make sure the pointer is not in the object's headers or link edit information. Radar bug #6081358. Changes for the 5.28 release (the cctools-779 release): - Fixed bugs in install_name_tool.c in parsing -change and -rpath. Radar bug #7477104. Changes for the 5.28 release (the cctools-777 release): - Changed round() to rnd() and stuff/round.h to stuff/rnd.h in all files and removed -fno-builtin-round from the Makefile. Radar bug #7475139. - Changed the Makefile to use -Os for OFLAG. Radar bug #7475093. - Change contents_pointer_for_vmaddr() in redo_prebinding.c to ignore segments with a zero vmaddr since these are unmapped segments. Radar bug #7467115. Changes for the 5.28 release (the cctools-776 release): - Improved the error checking in the redo_prebinding code so that contents_pointer_for_vmaddr() checks to make sure the pointer is in the section's contents of the segment. Checks also added to libstuff's check_Mach_O() in ofile.c to make sure that sections are contained in their segments. Radar bug #6081358. Changes for the 5.27 release (the cctools-773 release): - Fixed a typo in two lipo(1) error messages where "it's" should have been "its". Radar bug 7362293. Changes for the 5.27 release (the cctools-772 release): - Fixed a bug in lipo(1) with the -extract option in main() in the loop that was removing those thin files not marked for extraction where the inner loop was looping once to many times. Radar bug #7255585. Changes for the 5.27 release (the cctools-768 release): - Fixed a bug in checksyms() that was not verifying read-only-relocs in 64-bit binaries. The routine check_dynamic_binary() had a typo where LC_SEGMENT should have been LC_SEGMENT_64. Also changed checksyms() to not call check_dynamic_binary() if the filetype is MH_KEXT_BUNDLE. Radar bug #7236271. Changes for the 5.27 release (the cctools-762 release): - Changed the Makefile to set CC when when SDKROOT is set. Radar bug #7078805. Changes for the 5.27 release (the cctools-760 release): - Changed the lipo(1) so the the armv7 stuff is a no longer