TODO (post MacWorld): - Test coalesced symbols with -static code gen and with rld()? TODO: - If a two-level library is loaded the definition from the specified library is not loaded when there is another definition. This can lead to ld not catching a multiply defined symbol in a flat library as dyld would cause. Test case in ~/bug_tests/Puma5D13.Sampler . - Might be a bug in search_dynamic_libs() if it is searching an archive then it does not take into account -all_load or -Objc. - The sreloc->r_address field is only 24-bits (16 meg) and can overflow producing bad relocation entries in the output file. To test for this a handful of checks would need to be added to the *_reloc.c file after update_reloc and other files that put out relocation entries. - The LC_PREBOUND_DYLIB commands do not have the modules used via N_INDR symbols marked in the linked_modules bit vector. - Add check for undefined dyld_stub_binding_helper and __dyld_func_lookup if output_for_dyld is set. - Think about how indirect section would be ordered if allowed. Build problems: - For i386 builds with -dynamic -fomit-frame-pointer produces bad code (bug #52986) - For m68k builds -finline-functions crashes the compiler (used in the Makefile on the ld_build target). Changes for the 5.9 release (the cctools-382 release): - Fixed the change below for cctools-381. The ifndef RLD should only have been around twolevel_namespace_hints_specified not twolevel_namespace_hints. - Fixed the building of static_kld when $(SRCROOT) = . which needed otmp_obj after libmacho/otmp_obj in the Makefile. Changes for the 5.9 release (the cctools-381 release): - Added an ifndef RLD around the definition of twolevel_namespace_hints so that it would not get a warning when the ofiles_install target is built. Changes for the 5.9 release (the cctools-380 release): - Added the -twolevel_namespace_hints option which is off by default for bundles and on otherwise. The changes are in ld.c, layout.c, symbols.c and pass2.c. Radar bug #2735266. Changes for the 5.9 release (the cctools-377 release): - Fixed a problem with the change below in cctools-376 to process_undefineds() in symbols.c that would not build when RLD was defined. Changes for the 5.9 release (the cctools-376 release): - Fixed a bug in search_dynamic_libs() in pass1.c that should not have free()'ed the "fake" merged_symbol when -Y was used. This caused the code in process_undefineds() in symbols.c to crash. - Fixed a bug in process_undefineds() in symbols.c that was not correctly reporting undefined symbols for the -Y flag correctly. It should not have had the expression merged_symbol->twolevel_reference == TRUE when testing for undefined symbols. Changes for the 5.9 release (the cctools-375 release): - Fixed a bug in fine_reloc_output_sectnum() in objects.c where it should do the same thing for lazy pointer sections as well as non-lazy pointer sections. This case showed up when a non-pic symbol stub was used for a local symbol. In this case the relocation entry to the lazy pointer was not a scattered relocation entry so fine_reloc_output_sectnum() was being called by ppc_reloc.c. In the case for a local symbol the lazy pointer will not be in the output so it does not even matter what the section number being returned is. - Fixed ld(1) to correctly support the semantics of two-level namespace library references. Radar bug #2716249. The basic approach is was to "fake" up a merged_symbol with the new twolevel_reference bit set and add it to the undefined list in merge_dylib_module_symbols() in symbols.c when it was merging a dylib module from a two-level namespace dylib. Then search_dynamic_libs() would look for these entries in the undefined list and search for the dylib module that defines them name call merge_dylib_module_symbols() to load the specified dynamic library. Changes to process_undefineds() in symbols.c were also needed to check for remaining two-level references and report them correctly. Changed search_dynamic_libs() in pass1.c to always set up the sub_images even if -twolevel_namespace is not in effect as it is needed when a two-level namespace library is used to resolve its references with the correct semantics. Added the twolevel_reference bit and the referencing_library field to the merged symbol struct in symbols.h. - Removed a number of #ifndef RLD #endif pairs from symbols.c that were already inside an outer #ifndef RLD #endif pair. These were inside the functions command_line_indr_symbol(), merge_dylib_module_symbols() and merge_bundle_loader_symbols() and all around the calls to tell_ProjectBuilder(). Changes for the 5.9 release (the cctools-373 release): - Changed the default to -twolevel_namespace in ld.c. Also adding setting twolevel_namespace to FALSE for -force_flat_namespace and -static. Also removed some #ifdef notdef code after the testing of LD_TWOLEVEL_NAMESPACE. Changes for the 5.9 release (the cctools-371 release): - Added a log message ""[Logging for XBS] Referenced bundle loader: " when the environment variable XBS_TRACE_BUNDLE_LOADER is set where is the argument of -bundle_loader if set. Radar bug #2710229. Changes for the 5.9 release (the cctools-370 release): - Added the -nomultidefs flag to ld(1) to set the MH_NOMULTIDEFS flag in the mach header. - Added support in ld(1) for the two-level namespace hints optimization. Radar bug #2558069. The following field was added to the struct merged_symbol in symbols.h: /* * For two-level namespace hints this is the index into the table of * contents for the definition symbol in the dylib it is defined in, */ unsigned long itoc; In search_dynamic_libs() in pass1.c code was added to set the itoc field in the merged symbol after it was found in a DYLIB. if(twolevel_namespace == TRUE) undefined->merged_symbol->itoc = toc - q->tocs; Also in merge_dylib_module_symbols() in symbols.c the itoc of a merged symbol is set if not zero as the symbol in the merged symbol table could be a common or undefined. This changed required the function dylib_bsearch() in pass1.c to now be __private_extern__ rather than static. Also with this the variable strings and symbols were changed to bsearch_strings and bsearch_symbols in pass1.c and made __private_extern__ rather than static. The following new struct was added to layout.[ch] to hold info about the hints: /* * The output file's two level hints load command. */ struct hints_info { struct twolevel_hints_command twolevel_hints_command; }; __private_extern__ struct hints_info output_hints_info; In assign_output_symbol_indexes() in symbols.c number of hints was set based on the value of nundefsym. In layout_segments() in layout.c accounting for the size of the hints in the linkedit segment was done. Also in layout_segments() in layout.c code was added to account for the hints command and its size. Also in layout_segments() in layout.c the offsets to the hints table are set as to be just after the symbol table. In output_headers() in pass2.c the hints command is placed in the output. In setup_output_flush() in pass2.c the space between the end of the symbol table and the start of the hints is flushed and the offset is moved to the end of the hints table. In output_merged_symbols() in symbols.c at the end of the routine it outputs the two-level namespace hints. In check_cur_obj() in pass1.c added code to check a LC_TWOLEVEL_HINTS command. Changes for the 5.9 release (the cctools-369 release): - Added kld_load_from_memory & kld_load_basefile_from_memory for the dynamic build variant of libkld. These APIs will be used by the Kernel's dynamic OSObject patch code. Changes in rld.c . Changes for the 5.9 release (the cctools-368 release): - Fixed a bug with -bundle_loader and cross bytesex links. Code to swap the symbol table of a BUNDLE_LOADER was added to search_dynamic_libs() in pass1.c. - Also needed a test in merge() in pass1.c before add_dynamic_lib() was called for a BUNDLE_LOADER to make sure it has symbols as it could be of the wrong architecture and will cause later code in search_dynamic_libs() to crash. Changes for the 5.9 release (the cctools-367 release): - Added support for the -sub_library option. Radar bug #2697458. The following field was added to the struct dynamic_library in pass1.h: char *library_name; Added code in check_cur_obj() in pass1.c to check LC_SUB_LIBRARY command. Changed search_dynamic_libs() in pass1.c in the third major block of code that sets the library_ordinals to set the library_name field like the umbrella_name field of the dynamic_library struct. Added code to setup_sub_images() in pass1.c to handle sub_librarys as it handles sub_umbrellas. Changed set_sub_umbrella_ordinal() to set_sub_umbrella_sub_library_ordinal() to do both sub_umbrellas and sub_libraries. And factor out the code that sets the index into the sub_images into the routine set_isub_image(). - Added support in ld(1) to build the two-level namespace sub images arrays for each dynamic library when -twolevel_namespace is in effect. This is for the two-level namespace hints optimization. Radar bug #2558069. The following fields were added to the struct dynamic_library in pass1.h: /* following are used when -twolevel_namespace is in effect */ unsigned long ndependent_images; struct dynamic_library **dependent_images; enum bool sub_images_setup; unsigned long nsub_images; struct dynamic_library **sub_images; enum bool twolevel_searched; The following fields were added to the struct object_file in objects.h: unsigned long isub_image; /* when -twolevel_name space is in effect */ /* this the sub_image index for recording */ unsigned long nload_dylibs; /* Number of LC_LOAD_DYLIB commands */ TODO: need to add code in check_cur_obj() to check LC_TWOLEVEL_HINTS command then the hints. Changed check_cur_obj() in pass1.c to increment nload_dylibs in the cur_obj for each LC_LOAD_DYLIB commands. Changed search_dynamic_libs() in pass1.c in the first major loop in to allocate the dependent_images as well as the second major loop for dependent libraries when -twolevel_namespace is in effect. Changed search_dynamic_libs() in pass1.c in the second major loop in to fill in the dependent_images from the return value of add_dynamic_lib() when -twolevel_namespace is in effect. Changed search_dynamic_libs() in pass1.c in the third major block of code that sets the library_ordinals added a loop that calls the new routine setup_sub_images() that has the same logic as in dyld's images.c. Added code in both set_sub_frameworks_ordinals() and set_sub_umbrella_ordinal() to set the isub_image for the libraries. Added code in search_dynamic_libs() when the debug 22 bit is set and -twolevel_namespace is in effect to printout the dependent and sub images. After the sub_images arrays are set up the main loop to search for undefined symbol in search_dynamic_libs() was changed to search all the sub_images of each DYLIB as it is encountered. The new twolevel_searched field is first set to FALSE in all the dynamic_libray structs in the list and if a symbol is not found in a DYLIB then all the sub_images are searched in turn. This same bit of logic is also done in the last loop that checks merged symbols coming from dynamic libraries. - Fixed a bug where if only the -stack_size was set then the default stack address value used was not put into the thread state. This change was in layout_segments() in layout.c where it now simply sets stack_addr_specified to TRUE after calling get_stack_addr_from_flag(). Changes for the 5.9 release (the cctools-361 release): - Added the -prebind_allow_overlap flag as well as the LD_PREBIND_ALLOW_OVERLAP environment variable which allow prebinding to still be done even if some of the libraries overlap. Changes in ld.c, ld.h and layout.c in check_overlap(). - Added the case for LC_PREBOUND_DYLIB in check_cur_obj() in pass1.c as it was missing and -bundle_loader arguments can have these load commands. - Fixed a bug add_dynamic_lib() in pass1.c that changed the definition_obj of a dynamic_library struct when it was a sub-umbrella. This was old code from the first attempt (cctools-344) to get the primary library stuff for two-level namespace working. This bug caused a cross bytesex link to fail because when the symbolic info for each dylib was set up in search_dynamic_libs() it swapped the nlist structs more than once because more than one dynamic_library struct pointed to the same info. Changes for the 5.9 release (the cctools-360 release): - Ifdef'ed out the code that turns off -twolevel_namespace when the environment variable LD_TWOLEVEL_NAMESPACE is set and -undefined is specified that is not "error" or any -U flags are specified to cause hard errors for now. This may have to be put back in at some point. But we want things to fail at first to find projects that use these flags. - Added savestr() to ld.c to avoid a multiply defineds for allocate() and reallocate(). - Changed the Makefile so that static_kld build will use libmacho from the the $(SYMROOT) not from /usr/local/lib/system. - Added a definition of savestr() to rld.c to avoid pulling in allocate.o from libstuff. - Changed the Makefile so that the rld stuff does not get built for RC_OS being macos and RC_RELEASE being after Cheetah. Changes for the 5.9 release (the cctools-359 release): - Added the -multiply_defined flag for the treatment of two-level namespace multiply defined symbols. It takes error, warning and suppress as arguments with warning being the default. - Added the LD_TWOLEVEL_NAMESPACE environment variable to turn on -twolevel_namespace when -flat_namespace and -static are not specified. It is also not turned on when -undefined is specified that is not "error" or any -U flags are specified but prints a warning that LD_TWOLEVEL_NAMESPACE is ignored. - Changed check_overlap() in layout.c for the check that does not disable prebinding when there is an overlap with a split library's __LINKEDIT segment such that an executable can be linked where some it the libraries it links with split libraries that are not stripped it does not disable prebinding. - Added checking force_flat_namespace when checking for MH_TWOLEVEL so that if forcing a flat name space the checking for multiply defined symbol is treated as an error even if a two-level namespace library is used. - Changed check_dylibs_for_reference() in pass1.c to only check for references in flat libraries so that two-level namespace libaries can be used with different references and the resulting item being linked can be prebound except when -force_flat_namespace is also being used. - Added the check and printing a message about unused multiply defined symbols when -twolevel_namespace is in effect. This is done with the new routine twolevel_namespace_check_for_unused_dylib_symbols() defined in pass1.c and called from layout() in layout.c . To implement it the routine check_dylibs_for_definition() in pass1.c was change to take two flags so it can be used for prebinding and two-level name space checks. - Added the -bundle_loader and -private_bundle flags. Along with many other changes this allows -bundle outputs to have their undefined symbols to be checked against the executable. This is required for -bundle outputs and -twolevel_namespace when the bundle references symbols from the executable and EXECUTABLE_ORDINAL gets recorded for the library ordinal. - Added -Wno-long-double to shutup the compiler for . - Added a check to make sure -U flags are not used when twolevel_namespace is in effect. - Fixed a bug with or'ing in of REFERENCED_DYNAMICALLY in merge_dylib_module_symbols() in symbols.c on line 1965 which should not be or'ed in when the dynamic library is a MH_TWOLEVEL. - Fixed a bug in merge_dylib_module_symbols() that incorrectly flagged a multiply defined symbol as an error not a warning when one symbol came from a flat library and one came from a two-level library and we were building an executable. Changes for the 5.8 release (the cctools-355 release): - Changed the include file to in rld.c and sets.c . Radar bug #2579488. - Changed the way -twolevel_namespace sets the primary ordinal and reports errors for illegally referenced indirect libraries from the cctools-344 original implementation: In search_dynamic_libs() in pass1.c after all the dependents are added a set of loops were added to propagrate the library ordinals to the sub-frameworks and sub-umbrellas. The new routines set_sub_frameworks_ordinals() and set_sub_umbrella_ordinal() are called from these loops. These new routines are also defined in pass1.c. The new field umbrella_name was added to the dynamic_library struct in pass1.h . Then in merge_dylib_module_symbols() before the merged_symbol is updated to the definition of the symbol in the dylib a check is made to see if the symbol is referenced from an object going into the image and will need the library ordinal recorded. If so a check to see if the library ordinal was assigned is done and if not an error for an illegal reference to a symbol defined in a indirectly referenced dynamic library is issued. The new field indirect_twolevel_ref_flagged was added to the dynamic_library struct in pass1.h . All the code added to the open_dylib() in pass1.c in the cctools-344 implementation for twolevel-namespace was removed. Changes for the 5.8 release (the cctools-353 release): - Change ld(1) to allow section difference references to coalesced symbols where the symbol being referenced is private extern or local. This is needed so that the zero overhead exception tables can make pic references to the private extern symbols that the compiler creates for template functions. To do this the fine relocs created for coalesced symbols that are private externs are marked with local_symbol == TRUE in coalesced_section_merge() in coalesced_sections.c. Then in legal_reference() in indirect_sections.c the first test had the additional conditional check to allow the reference when the reference was to a block that local_symbol == TRUE. Then a change to fine_reloc_output_address() in objects.c to deal with a coalesced section where local_symbol == TRUE and use_contents == FALSE was made to pick out the merged_symbol pointer from the output_offset field. Radar bug #2573679. - Changed prebinding_check_for_dylib_override_symbols() in pass1.c to not continue when merged_symbol->defined_in_dylib == TRUE and go head and call check_dylibs_for_definition(). Then a change was made to check_dylibs_for_definition() that skipped merged symbols defined in a dylib for the current dylib being checked. This allow catching symbols being overridden in a dylib from a different dylib. This happens when both System and System_profile are linked (and have different prebound addresses). Radar bug #2564555. Changes for the 5.8 release (the cctools-350 release): - Added a call to vm_msync() in pass1() in pass1.c and pass2() in pass2.c under the #ifdef VM_SYNC_DEACTIVATE conditional. Radar bug #2567196. Changes for the 5.8 release (the cctools-349 release): - Added code in pass2() in pass2.c to use fcntl() with the F_NOCACHE option to not cache the blocks of the output file. - Fixed a bug in compiling the without -DDEBUG in count_relocs() in sections.c where the setting of map->nextrel and map->nlocrel where in ifdef DEBUG code that should not have been. Changes for the 5.8 release (the cctools-347 release): - Changed merge_dylib_module_symbols() in symbols.c for handling multiply defined symbols to treat them as warnings when building images when -twolevel_namespace is in effect and the symbol does not come from a dylib or if the symbol is coming from a dylib with MH_TWOLEVEL. Changes for the 5.8 release (the cctools-346 release): - Added the printing of why prebinding was disabled when environment variable RC_TRACE_PREBINDIND_DISABLED is set. This also uses the new -final_output flag which the driver can pass as the actual name of the output file being created which is used in the message: [Logging for Build & Integration] prebinding disabled for <<-final_output argument>> because REASON Radar bug #2550094. - Fixed a bug in coalesced_section_merge() in coalesced_sections.c where it did not take into account the private extern bit of a merged symbol of an external relocation entry when the output is MH_BUNDLE. Radar bug #2548925. Changes for the 5.8 release (the cctools-345 release): - Changed the setting of -segs_read_write_addr if picking zeros up both the -segs_read_only_addr and -segs_read_write_addr then the value 0x10000000 is used for the -segs_read_write_addr. Radar bug #2544818. - Changed the segment overlap checking to not disable prebinding when building a split library and a segment overlaps a linkedit segment of any split library. Radar bug #2543932. - Fixed a bug in main() in ld.c where this line: if(client_name != NULL != 0) should have been: if(client_name != NULL) Changes for the 5.8 release (the cctools-344 release): - Added code for tracking and setting the library ordinal when -twolevel_namespace is in effect. Radar bug #2538835. The ordinal for the "primary" library is assigned in search_dynamic_libs() in pass1.c for the libraries on the list before any dependents are added. This is stored in the object_file struct in the library_ordinal field. The routine search_dynamic_libs() in in pass1.c calls open_dylib() in pass1.c for the dependent dylibs which returns TRUE or FALSE as whether to keep the dependent lib on the list of dylibs to be searched. The routine open_dylib() does the work of determing if a dependent dylib is to be kept when -twolevel_namespace is in effect. It has the code to deal with sub-frameworks of umbrella frameworks and sub-umbrellas. It is the one that sets the library_ordinal from the primary library into the dependent dylib. The setting of the library ordinal in the n_desc field of a symbol is done in the routine merge_dylib_module_symbols() in symbols.c which is passed the struct dynamic_library for the library that the module comes from. And is done with this code: if(twolevel_namespace == TRUE){ SET_LIBRARY_ORDINAL(merged_symbol->nlist.n_desc dynamic_library->definition_obj->library_ordinal); } - Added a check to make sure -undefined error is used when -twolevel_namespace is in effect. Radar bug #2538835. - Added building kld_build for cctoolslib when RC_OS is macos and RC_RELASE is not Bunsen, Beaker, Gonzo or Kodiak. The kernel Radar that install the libsa headers is 2537868. The Radar for this change is 2538829. - Fixed a bug with -keep_private_extern logic and coalesced symbols that did not generate an external relocation entry when it should. The change was this: if((merged_symbol->nlist.n_type & N_PEXT) == N_PEXT || keep_private_externs == TRUE || ... to this: if(((merged_symbol->nlist.n_type & N_PEXT) == N_PEXT && keep_private_externs == FALSE) || ... in ppc_reloc.c, coalesced_sections.c, generic_reloc.c, hppa_reloc.c, i860_reloc.c, indirect_sections.c, m88k_reloc.c, and sparc_reloc.c. Radar bug #2536788. - Fixed a bug with checking the LC_SUB_UMBRELLA that caused it to crash as it was using the 'sub' variable for LC_SUB_FRAMEWORK load commands not the 'usub' variable. This is in check_cur_obj() in pass1.c. Radar bug #2538825. Changes for the 5.8 release (the cctools-342 release): - Fixed a problem with the change for Radar bug #2503688 that was in cctools-341 that was in merged_symbol() that should have not changed to using the merged_symbol instead of the object_symbols for the setting of the reference type in a dynamic library. - Fixed a bug with -keep_private_externs that was setting of the indirect table to INDIRECT_SYMBOL_LOCAL (or INDIRECT_SYMBOL_ABS) when it should not. This shows up as a problem when the indirect table entry is for a private_extern symbol. The change is in output_indirect_symbols() in indirect_sections.c to add a check for keep_private_externs == FALSE. Radar bug #2534011. - Fixed the another bug with a coalesced symbol that is a private extern (when -keep_private_externs is NOT in effect) in that the value of the non-lazy symbol pointer is not set to the value of the symbol (though the index is set to INDIRECT_SYMBOL_LOCAL). The setting of the non-lazy symbol pointer is done in scatter_copy() in sections.c based on the fine_relocs indirect_defined field that is always FALSE for coalesced symbols (to keep indirection). The function is_pass2_merged_symbol_coalesced() was added and logic was added to scatter_copy() to use it and set the non-lazy symbol pointer. Radar bug #2534011. - Added support for -allowable_client and -client_name flags. Radar bug #2533649. - Added first bit of support for the -flatname_space, -twolevel_namespace, and -force_flat_namespace options. Parsing the options and setting MH_TWOLEVEL and MH_FORCE_FLAT in the header's flags. Radar bug #2534043. Changes for the 5.8 release (the cctools-341 release): - Added the -sub_umbrella option Radar bug #2530028. - Changed the Makefile to build libkld.a and libkld.dylib for cctoolslib builds. Many ifdefs were added and changed in rld.c to implement the kld APIs and many ifdefs were added all the other files to build with the Kernel framework. Radar bug #2523649. - Changed ld.c to initalize the value of arch_flag when KLD and __STATIC__ are defined so that code in pass1.c can avoid using host_info via get_arch_from_host() which is also ifdef'ed out when KLD and __STATIC__ are defined (see pass1_fat() in pass1.c). - Changed merge_sections() in sections.c to not merge the section alignment from the base file for KLD. - Changed the ifdef's in rld.c to make only sa_rld() and sa_rld_with_symtab() are left as externals for libsarld.a. Also changed sa_rld_output_addr and sa_rld_output_size to private_externs. - Removed the test to make sure -init is also specified when -run_init_lazily is specified as now module initialization routines can also be run lazily. Radar bug #2502941. - Changed the final loops in search_dynamic_libs() in pass1.c that checks "all merged symbols coming from dynamic libraries from the first one defining the symbol" to ignore symbols with coalesced_defined_in_dylib as TRUE. Radar bug #2503703. - Fixed a bug in merge_symbols() where the first symbol merged was a coalesced global symbol from a dynamic library and the next was from an object (libcc_dynamic.a) which was causing it to be a multiply defined symbol. The field coalesced_defined_in_dylib also needed to be checked if defined_in_dylib is TRUE. Radar bug #2503694. - Fixed a yet another bug in merge_symbols() in symbol.c when a private extern coalesced symbol gets discarded. The counts for cur_obj->nextdefsym was decremented in all cases when it should have only been decremented in the case the symbol was not a private extern. Radar bug #2503688. Changes for the 5.7 release (the cctools-337 release): - Fixed two bugs in the handling of lower level error later causing an internal error. The fix was to test errors for non-zero and return from the routine. this was added to output_section() in sections.c after the relocs routines and pass2 in pass2.c after output_section() call. - Fixed a bug in print_whatsloaded() in objects.c where it did not print the archive name for extended format #1. - Fixed a bug in coalesced_section_merge() in coalesced_sections.c where it did not take into account the private extern bit of a merged symbol of an external relocation entry when the output is MH_DYLIB. Radar bug #2497954. Changes for the 5.7 release (the cctools-335 release): - Fixed a bug in merge_symbols() in symbol.c when a private extern coalesced symbol gets discarded. The counts for cur_obj->nprivatesym and nmerged_private_symbols need to be decremented in the case the coalesced symbol gets discarded. Radar bug #2493452. - Fixed a bug in literal_pointer_output() in literal_pointers.c for split libraries that did not correctly set the r_address field for literal pointer relocation entries. Radar bug #2493445. Changes for the 5.7 release (the cctools-334 release): - Changed guess_short_name()'s has_suffix argument to return a pointer to the suffix so checksyms could check for "_debug". This effected ld(1)'s guess_short_name() two calls. - Added the -run_init_lazily flag and the variable lazy_init so to mark the dynamic library with MH_LAZY_INIT. Changes in ld.c, ld.h and layout.c. Radar bug #2490396. Changes for the 5.7 release (the cctools-330 release): - Changed merge_dylib_module_symbols() in symbols.c to have a last pass that looks for private undefined references and links them in. To do this the dynamic_library struct needed to be passed to it. This causes pass1.h to be needed before including symbols.h so many other files also have this change. The change to merge_dylib_module_symbols() is needed so that dynamic libraries that have had nmedit run on them will get the proper semantics and detect multiply defined symbols at link time. This also gets the LC_PREBOUND_DYLIB commands do have the modules used via private externs symbols marked in the linked_modules bit vector. This is part of Radar bug #2420307. Changes for the 5.7 release (the cctools-330 release): - Changed the ifdef's for the standard_framework_dirs in pass1.c s that moving forward /Library/Frameworks is part of the default and /Local/Library/Frameworks is only used instead if __GONZO_BUNSEN_BEAKER__ is defined for older DP4, DP3 & PR2 builds. Radar bug #2477862. - Changed the call to netname_look_up() in check_for_ProjectBuilder() to bootstrap_look_up() when __OPENSTEP__ and __GONZO_BUNSEN_BEAKER__ is not defined (Radar bug #2473864). - Fixes the error message about only using -umbrella when -dylib is used to use "-umbrella" where it was using "-sub_framework". Radar bug #2477866. Changes for the 5.7 release (the cctools-329 release): - Changed iinit and ninit fields of the struct dylib_module in mod_section_merge() in mod_sections.c to iinit_iterm and ninit_nterm and added checks for overflow in there. Also added in the code to handle setting the module table entries in output_dylib_tables() in symbols.c and is nolonger #ifdef'ed DYLIB_TERM. Radar bug #2469527. Changes for the 5.7 release (the cctools-328 release): - Changed where the libraries get installed by default. So going forward things get install in /usr/local/lib/system and /Local/Developer/System is only used for RC_OS=macos when RC_RELEASE is Gonzo, Bunsen, or Beaker. Changes for the 5.7 release (the cctools-327 release): - Changed back where ld(1) picks up its the System Framework's private headers. It will continue to look in /System/Library/Frameworks/System.framework/PrivateHeaders and may someday will lookin in /MacOSX/System/Frameworks/System.framework/PrivateHeaders in some post-DP4 release. - Changed where the libraries get installed by default. So going forward things get install in /AppleInternal/Developer/System and /Local/Developer/System is only used for RC_OS=macos when RC_RELEASE is Gonzo, Bunsen, or Beaker. - Changed the ifdef's for the standard_framework_dirs in pass1.c s that moving forward /MacOSX/Library/Frameworks is part of the default and /Local/Library/Frameworks is only used instead if __GONZO_BUNSEN_BEAKER__ is defined for older DP4, DP3 & PR2 builds. Changes for the 5.6 release (the cctools-325 release): - Fixes a bug in merge_dylib_module_symbols() in symbols.c where it was using [i] as an index into the symbol table where it should have been using [j] in two places. This was causing Gonzo1I10 ld's to crash via libtool with the message "/usr/bin/libtool: fatal error in ld". Changes for the 5.6 release (the cctools-324 release): - Fixed a bug in merge_symbols() in symbols.c in the BINCL/EINCL logic. In the case where the there is a missing EINCL the logic will run into the global symbols and mistakenly count them as local symbols. Thus causing an internal error: "output_local_symbols() inconsistent local symbol count". - Fixed a bug in merge_dylib_module_symbols() where if a coalesced symbol only appears in dylibs then a multiply defined error resulted. To make this fix a new bit, coalesced_defined_in_dylib, in the merged_symbol struct in symbols.h was also added. Changes for the 5.6 release (the cctools-323 release): - Changed where the libraries get installed for the Space release in preparation of this "Half Plan" becoming the default for DP4 (Gonzo). This directory /Local/Developer/System is changing to /AppleInternal/Developer/System. - Changed the ifdef __SPACE__ for the standard_framework_dirs in pass1.c as the directory changes have been scaled back and changed. In preparation of this "Half Plan" /Local/Library/Frameworks was changed to /MacOSX/Library/Frameworks and ifdef'ed __SPACE__. In the second half of the plan (post-DP4) /System/Library/Frameworks will change to /MacOSX/System/Frameworks and this is ifdef'ed __SPACE2__. - Changed back where ld picks up its the System Framework's private headers back to /System/Library/Frameworks/System.framework/PrivateHeaders from /MacOSX/System/Frameworks/System.framework/PrivateHeaders for the Space release. This won't change till post-DP4. Changes for the 5.6 release (the cctools-322 release): - Added ifdef'ed for __SPACE__ to the standard_framework_dirs in pass1.c in preparation for the directory changes. /System/Library changing to /MacOSX/System. Changes for the 5.6 release (the cctools-320 release): - Fixed a bug in open_dylib() in pass1.c where if more than one -dylib_file arguments were used and more than one dylib was linked and a dylib was then found in the -dylib_file the next call to open_dylib() would crash because the ':' was not restored after the first one was found. - Added the -umbrella framework_name option to guarding against direct linking of non-umbrella frameworks. Radar bug 2443212. Changes for the 5.6 release (the cctools-319 release): - Added the -seg_addr_table option and the LD_SEG_ADDR_TABLE environment variables as alternate ways to set the addresses of dynamic shared libraries. - For MH_SPLIT_SEGS format the r_address field of relocation entries is to be relitive to the first read-write segment. This is to deal with the fact that the r_address field in scattered relocation entries is 24 bits and this format is used for prebound lazy pointers. So the changed for this was changing what the addr_adjust gets set to in reloc_output_for_dyld() in sections.c . This is possible as it is not legal to have relocation entries in read-only segements in this format. So to enforce this main() in ld.c checks to make sure -read_only_relocs is set to error when -segs_read_only_addr is used. - Removed a few unneeded tests for r_scattered after tests for r_extern in reloc_output_for_dyld() in sections.c as scattered relocation entries are alwasys local. Changes for the 5.6 release (the cctools-318 release): - Fixed a bug in the Makefile that installed the archive libraries without the -p option. This caused their table of contents to be out of date. And is needed as the kern loader is linking with librld.a . Also changed the Makefile to install librld's into /usr/local/lib . (Radar bug #2436955). Changes for the 5.6 release (the cctools-316 release): - Changed a check in indirect_sections.c in indirect_section_merge() where it was checking the relocation entries of lazy symbol pointer sections to make sure r_symbolnum was not R_ABS. The change was to first check that r_extern is 0 and it is a local relocation entry before checking r_symbolnum == R_ABS as external relocation entries are legal with PowerPC code. Was a problem when the r_symbolnum was 0 as that is the save value as R_ABS for local relocation entries. (Radar bug #2431435). - Added the -segs_read_only_addr and -segs_read_write_addr options for MH_SPLIT_SEGS. Radar bug #2415906. Changes for the 5.5 release (the cctools-312 release): - Changed fine_reloc_output_address() in object.c to return the address of the merged_symbol for a S_SYMBOL_STUBS section when the merged symbol is defined in the cur_obj making the reference. To do this a merged_symbol field was added to the fine_reloc structure and filled in in indirect_section_merge() in indirect_sections.c. This is all needed to clean up after the compiler that generates calls through lazy stubs for symbols forward defined in the compliation unit. This is needed so that the dynamic linker can fully bind library init routines without such references being called back into dyld and then causing the init calls to be interleaved. Radar bug #2417690. Changes for the 5.5 release (the cctools-311 release): - Fixed a bug in merge_symbols() dealing with N_EXCL's seen as created by a previous ld -r pass. This caused gdb to print . Radar bug 2415697. Changes for the 5.5 release (the cctools-310 release): - Fixed a bug in search_dynamic_libs() in pass1.c where it was generating the warning message for use of -bind_at_load incorrectly. Radar bug 2378121. - Changed the order of the undefined symbols to not be sorted if -bind_at_load is used to correct for a case when -bind_at_load was used and the dynamic linker resolved the undefined symbols in a different order as to cause multiply defined symbols. Radar bug 2378121. - Fixed a bug in ld.c where it had a missing else so the -Sn ended up getting an error as an unknown flag. Radar bug #2415456. Changes for the 5.5 release (the cctools-308 release): - Fixed a bug in lookup_and_enter_include() in symbols.c at the end where it was not correctly inserting the new hash bucket in the chain. Also made -Si the default stripping. Radar bug #2410704. - Also fixed a warning in coalesced_symbols.c when compiling for sparc on Openstep 4.2. Changes for the 5.5 release (the cctools-307 release): - Added the -Si option for stripping duplicate include stab groups (N_BINCL and N_EINCL pairs). Also added the -Sn option to get the STRIP_NONE option when the -Si option becomes the default. Added the code at the end of merge_symbols() in symbols.c to determine which groups get excluded. Also code was added in output_local_symbols() in symbols.c after the loop for looping over the symbols to update N_BINCL's and create N_EXCL's. Radar bug #2410704. - Support for coalesced symbols has been added. Radar bug #2411273. - Add a warning suggesting the use of -bind_at_load in search_dynamic_libs() in pass1.c when lazy binding might produce different results when a definition of a symbol is used from a dynamic library and there is an earilier dynamic library that defines the same symbol. Radar bug #2378121. - Added printing a line like "[Logging for Build & Integration] Used dynamic " "library: dylib_name", where dylib_name is a dynamic library being used in the link. This is done when the environment variable RC_TRACE_DYLIBS is set and done in search_dynamic_libs() in pass1.c. Radar bug #2389955. Changes for the 5.4 release (the cctools-305 release): - Fixed a bug when -U flags were used and LD_PREBIND was set the code in process_undefineds() in symbols.c was setting errors and causing ld to exit non-zero. Changes for the 5.4 release (the cctools-302 release): - Fixed a bug in assign_output_symbol_indexes() in symbols.c for assigning the output indexes of private extern symbols. This cause calls to private_extern symbols through stubs to reference the wrong stub and thus call the wrong routine. This showed up for calls to routines in libcc_dynamic.a when the call was in a dynamic library (Radar bug #2374465). This resulted in throw() and dynamic_cast() to crash when in a shared library. The Finder was the one having these problems (Radar bugs 2369470 and 2364994). Changes for the 5.4 release (the cctools-301 release): - Changed sections.c so that qsort_load_order_values() is not #ifdef'ed RLD because it is used by coalesced_section_merge(). Changes for the 5.4 release (the cctools-300 release): - Added the -init option for a dynamic shared library initialization routine. This creates a new LC_ROUTINES load command to store this information. - The initial work for coalesced symbols has been added. This reads, deals with duplicate coalesced symbols and writes out the sections. It does not yet deal with relocation in a coalesced section or relocation to a coalesced section. Changes for the 5.4 release (the cctools-296 release): - For RC_OS=macos no longer build librld_static.a, the librld_pg.a version is now copied as librld_profile.a and a link to librld_debug.a is made from librld.a. Changes for the 5.3 release (the cctools-294 release): - Fixed two bugs in scatter_copy() in sections.c that was trying to update the values for INDIRECT_SYMBOL_LOCAL entries. There was a missing SWAP_LONG after the value was read. Also after the call to error_with_cur_obj() it did not return and the program then crashed. Changes for the 5.3 release (the cctools-292 release): - Changed setting the default segment alignment to call get_segalign_from_flag() in layout.c in layout() to allow setting the default segment alignment to 4K for PowerPC and 8K for everything else. Radar bug #2277625. - Added some braces to get rid of the warning message from the egcs compiler "warning: suggest explicit braces to avoid ambiguous `else'". This was done to pass1.c, sections.c and 8byte_literals.c . - Changed the return type of main() in ld.c from void to int to remove a warning from the egcs compiler. Also added a dummy return(0) to make the compiler happy. - Added -I$(NEXT_ROOT)/System/Library/Frameworks/System.framework/PrivateHeaders to the Makefile as the egcs compiler's cpp no longer searches this by default. This is needed to pick up for use with the rld interface. Changes for the 5.3 release (the cctools-291 release): - Made a fix to the ld -r change in cctools-288. The indirect entries should have only been changed for non-lazy sections. This change is in output_indirect_symbols() in indirect_sections.c . This problem would show up when executing a binary with the error from dyld: dyld: /System/Applications/MailViewer.app/MailViewer Undefined symbols: dyld_lazy_symbol_binding_entry_point The problem in this case was the Message framework built with the ld(1) that had the bug. This also has been seen in Carbon apps, with the problem the libbase. Changes for the 5.3 release (the cctools-288 release): - Changed ld(1) when doing an ld -r with an indirect entry for a private_extern to change the indirect symbol to INDIRECT_SYMBOL_LOCAL or INDIRECT_SYMBOL_ABS. This problem showed up when building the Message framework and would get the error from ld: "ld: indirect symbol:_y can not be a private extern". And also showed up in building Carbon when using strip which would produce the error message from ld: "ld: x.o indirect symbol table entry 0 past the end of the symbol table". - Fixed ld(1) so it would handle INDIRECT_SYMBOL_ABS and relocate the values of symbol pointers with INDIRECT_SYMBOL_LOCAL indirect table entries. Changes to sections.c and indirect_sections.c . This problem could be run into in one of three ways when a global symbol is changed to a non-global, via private_extern and ld -r, via nmedit and via strip. - Changed the message printed when the environment variable RC_TRACE_ARCHIVES is set from: "RC_TRACE_ARCHIVES archive_name" to: "[Logging for Build & Integration] Used static archive: archive_name". Radar bug #2310273. Changes for the 5.3 release (the cctools-286 release): - Change the use of the i386 cpp macro to __i386__ and ppc to __ppc__ - Added the support for the module termination section. This effected the files sections.c, pass1.c, mod_sections.c (renamed from modinit_sections.c), mod_sections.h (renamed from modinit_sections.h), pass2.c, and objects.h. The code to handle setting the module table entries in output_dylib_tables() in symbols.c is #ifdef'ed DYLIB_TERM and not compiled in yet. Changes for the 5.3 release (the cctools-285 release): - Removed a warning in ld.c that stated -keep_private_externs must be used with -dynamic. - Fixed a bug in check_cur_obj() in pass1.c that was printing an error: "indirect symbol table entry 353 past the end of the symbol table" if an indirect symbol table entry had the value INDIRECT_SYMBOL_LOCAL or INDIRECT_SYMBOL_ABS which can get created by strip(1). Found when the CoreGraphics framework was stripped removing two globals and then the resulting framework was linked against. - Added printing a line like "RC_TRACE_ARCHIVES archive_name", where archive_name is a archive being used in the output of the link. This is done when the environment variable RC_TRACE_ARCHIVES is set. Radar bug #2303376. - Changed the Makefile to build librld.a, librld_pg.a and librld_static.a in $(DSTROOT)/Local/Developer/System for MacOS X, that is when $(RC_OS) is macos. This to allow System framework to be built without using SUBLIBROOTS. Radar bug #2268413. Changes for the 5.3 release, MacOS X bring up (the cctools-282 release): - Changed task_self() to mach_task_self() for MacOS X. Also included "stuff/openstep_mach.h" for macros to allow it to still build on Openstep. Also changed ifdef's __SLICK__ to __OPENSTEP__. - Ifdef'ed __MACH30__ make.defs for mach_port_t vs mach_port. Also ifdef'ed out netname_look_up() call and #include for __MACH30__ in ld.c (these are not yet in the SDK). - Changed the Makefile to allow for RC_OS=macos for MacOS X builds. - Changed ld.c to #ifndef'ed __MACH30__ out #include - Changed make.defs to use mach_port_t instead of port_t . - Changed the Makefile to use MIG = $(NEXT_ROOT)/usr/bin/mig and $(MIG). - Chanded the Makefile to have mwcc use the -dependency-file option now that it does not cause build problems. - Changed the line rld_unload_all(FALSE, 1); to rld_unload_all(NULL, 1); in sa_rld_internal() so it would compile with the MetroWerks compiler. Changes for the 5.2 release (the cctools-275 release): - Fixed a bug in layout_dylib_tables() in symbols.c that was still using the ar_name from the archive header when creating a dylib module name. Now it uses the ar_name and ar_name_size fields from cur_obj. Radar bug #2239283. Changes for the 5.2 release (the cctools-274 release): - Changed the way segment addresses for segments without specified addresses are set. In layout_segments() in layout.c the first segment is set to zero. Except in the MH_EXECUTE case with a pagezero segment in which it follows the pagezero segment. Then for all other unassigned segments the addresses of is set to the next available address after the first segment that the vmsize if the segment will fit. This is done in the new routine next_vmaddr(). Radar bug #2237029. - Added a test in reloc_output_for_dyld() in sections.c to detect the case when the r_address of a prebound lazy pointer relocation entry overflows because the first segment is too far away from the item to be relocated. Radar bug #2237029. Changes for the 5.2 release (the cctools-272 release): - Added sa_rld_with_symtab() like sa_rld() but also passes the symbol table and string table in. Radar bug #2231758. Changes for the 5.2 release (the cctools-267 release): - Made the source code compile with MetroWerks compiler. Radar bug #2227678. - Changed the default for -read_only_reloc to error from warning. Radar bug #2227470. - Fixed a bug in layout_ordered_section() in sections.c on line 1143 and removed the code that was dealing specially with zero sized blocks. Radar bug #2226458. - Added all the suport needed for the 4.4BSD extended format #1. Radar bug #1670513. Changes for the 5.1 release (the cctools-265 release): - Changed the headerpad to the sizeof two section headers so objcunique will work. Radar bug #2224571. Changes for the 5.1 release (the cctools-260 release): - Added -c to all the install commands in the Makefile. Changes for the 5.1 release (the cctools-254 release): - Added the rld function rld_write_symfile() to be used by the kern loader. Changes for the 5.1 release (the cctools-253 release): - Changed the Makefile so /bin is not created for Rhapsody builds. - Changed the default Framework search path to match the new directory layout for Preimer. Changes for the 5.1 release (the cctools-251 release): - Corrected the cctools-249 fix to add_dynamic_lib() in pass1.c . Both the fields dylib_file and file_name needed to be set and only dylib_file was being set. Changes for the 5.1 release (the cctools-249 release): - Fixed a bug in layout_segments() in layout.c where MH_PREBOUND was getting set into the output mach header before check_for_overlapping_segments() was called which could turn off prebinding. - Fixed a bug in add_dynamic_lib() in pass1.c when $NEXT_ROOT was set and prebinding was enabled. The bug caused the library name with $NEXT_ROOT appended to be recorded in the LC_PREBOUND_DYLIB commands. The fix was not to change dylib_name in add_dynamic_lib() but to set dylib_file with the prepended $NEXT_ROOT if set. - Fixed a bug in output_merged_symbols() in symbols.c when indirect symbols are readied for output when prebinding is enabled. Indirect symbols were incorrectly being turned in to prebound undefined symbols. This would cause redo_prebinding to later fail because of undefined symbols (provided strip was run on the output and regrouped the symbol with the undefined symbols). This was causing the WindowServer to fail redo_prebinding with undefined symbols. Changes for the 5.1 release (the cctools-247 release): - Added MKDIRS if code to the Makefile to build native on Rhapsody. - Changed the Makefile to use gnutar instead of tar because it works on Rhapsody where tar does not. - Changed the Makefile so profiled objects get built for RC_OS teflon. - Changed the Makefile to install the ld only in /usr/bin for RC_OS teflon and in /bin for RC_OS nextstep. Removed the creation of symbolic links (Radar 1672088). - Changed the code ifdef __TEFLON__ to ifndef __SLICK__ (where __TEFLON__ will nolonger be defined for Rhapsody builds) so the default builds will be native Rhapsody builds. The changes were to ld.c, pass1.c, rld.c and ld.h . Changes for the 5.0 release (the cctools-246 release): - Changed in ppc_reloc.c other_half from unsigned short to unsigned long so PPC_RELOC_JBSR can store 32 bit values there and target address are no longer truncated to 16 bits. Changes for the 5.0 release (the cctools-245 release): - Fixed the symbolic link from /usr/bin/ld to ../../bin/ld (Radar 1672088). Changes for the 5.0 release (the cctools-243 release): - Added a symbolic link from /usr/bin/ld to $(DSTROOT)/bin/ld (Radar 1672088). Changes for the 5.0 release (the cctools-240 release): - Fixed a bug in indirect_section_merge() in indirect_sections.c when prebinding PowerPC -dynamic code gen. PowerPC relocation entries for lazy symbol pointers have external relocation entries. This was not taken into account when counting the relocation entries in the case of prebinding. Changes for the 5.0 release (the cctools-236 release): - Added the sarld_build target to the lib_ofiles target. Changes for the 5.0 release (the cctools-235 release): - Added handling of PPC_RELOC_JBSR to ppc_reloc.c . - Fixed the PPC_RELOC_BR24 to correctly check for overflow. It now checks the top 7 (not 6) bits are the same. - Removed two warnings in pass1.c checking ran_off for less than zero (it is unsigned). Changes for the 5.0 release (the cctools-234 release): - Removed the last check in legal_reference() in indirect_sections.c which made sure a lazy symbol pointer pointed into a stub. This is because for ppc lazy symbol pointers point to dyld_stub_binding_helper directly and there is no second half of the stub used (Radar #1661985). Changes for the 5.0 release (the cctools-233 release): - Removed the hack in layout_segments to ignore -seg1addr's greater than 0x4000000 for dynamic libraries for PowerPC. Changes for the 5.0 release (the cctools-225 release): - Fixes a bug left from the NRW linker where executables did not have a __PAGEZERO segment. - Added a hack in layout_segments to ignore -seg1addr's greater than 0x4000000 for dynamic libraries for PowerPC. Changes for the 5.0 release (the cctools-224 release): - Fixed a bug in define_common_symbols() in symbols.c which when defining common symbols when a common section exists in the input .o files which has an alignment less than the alignment needed for the common symbols being defined by the link editor. - Changed including to which uses unsigned long instead of off_t (64 bits on Teflon). - Fixed a warning in pass1.c. Changes for the 5.0 release (the cctools-223 release): - Put back the changes to rld.c ifdef __TEFLON__. Changes for the 5.0 release (the cctools-222 release): - Fixed a bug in ppc_reloc where it was not correctly calculating the immediate of a HA16 reloc by checking the 0x8000 bit of the other half and and sign extending it and adding it to form the correct immediate. - Added -stack_size option to set the stack size. This creates a __UNIXSTACK section. The bulk of the work in in layout_segments() in layout.c with new functions added to arch.c in libstuff to support stack direction, default size and address. - Added -stack_addr option to set the stack pointer. Added a second state to the struct thread_info because the hppa's stack pointer is in another flavor of thread state. - Removed a check in indirect_section_merge() in indirect_sections.c which was checking to make sure a local relocation entry for a lazy symbol pointer was pointing into a symbol stub section. With the change to allow lazy symbol pointers to have external relocations (for PowerPC pointers using dyld_stub_binding_helper) after an object has been "ld -r" (in this case crt1.o) the lazy symbol pointer is a local relocation entry. Changes for the 5.0 release (the cctools-221.6 and cctools-222 releases): - Picked up changes to rld.c for use of _NXArgv and __mh_execute_header to use _NSGetArgv() and _NSGetMachExecuteHeader(). Changes for the 5.0 release (the cctools-221.2 and cctools-222 releases): - Picked up changed layout.c to which changed the variable ppc to powerpc because the PowerPC compiler defines the cpp macro ppc to 1. Changes for the 5.0 release (the cctools-221.1 and cctools-222 releases): - Picked up changed to the Makefile to not build profile objects for teflon. This is because the PowerPC compiler core dumps with -pg. Changes for the 5.0 release (the cctools-221 release): - Picked up the changes for the correct Rhapsody thread state changes into layout.c. Changes for the 5.0 release (the cctools-220 release): - Fixed a bug in add_dynamic_lib() in pass1.c that was not prepending $NEXT_ROOT to the paths of dependent dynamic libraries. Changes for the 5.0 release (the cctools-218 release): - Added hacks to pad pure instruction sections of i386 outputs with nop's (opcode 0x90) to clean up dissassembly. This is done in output_section() secions.c and in the new function nop_pure_instruction_scattered_sections() (bug #77806). - Added .section_align to like .section_offset . This causes the next item to be placed on the power of 2 alignment of align_value (bug #77807). Changes for the 5.0 release (the cctools-218 release): - Fixed a warning with "static jmp_buf rld_env's initializer" in rld.c which needed an ifdef for i386. Changes for the 5.0 release (the cctools-216 release): - Made changes to allow external relocation entries for lazy symbol pointer sections. First had to remove a test in indirect_section_merge() in indirect_sections.c which checked that relocation entries in lazy pointers sections must not have external relocation entries. Just below that I added the checks needed for external relocation entries. Second in each of the relocation routines I added just after the update_reloc: label the changing of an extern relocation to a prebound lazy pointer if needed. - Changed ld.c to just include libc.h for Teflon. Changes for the 5.0 release (the cctools-215 release): - Added the $(RC_OS) trick to the all target as well as the lib_ofiles target so this will build on the Teflon SDK. - Added #include in ld.c on the #ifdef __TEFLON__ side so O_RDONLY does not come up undefined with the Teflon SDK. - Added support for the PowerPC section difference HI16, LO16 and HA16 relocation types. Changes for the 4.2 & 5.0 releases (the cctools-213 & cctools-209.3 releases): - Fixed a bug in check_dylibs_for_definition() where it was printing the module name of the dynamic library wrong because it was using strings where it should have been using p->strings. - Fixed a typo in an error message in open_dylib() in pass1.c where "effected" should have been "affected" (bug #77070). - Fixed a bug where prebinding was not getting done when a private extern was overridding a symbol in a dependent library. The fix was not to check private externs in prebinding_check_for_dylib_override_symbols() in pass1.c Changes for the 5.0 release (the cctools-212 release): - Fixed a bug where $NEXT_ROOT did not prefix standard framework paths. Also fixed -Z to not use standard framework paths. Changes for the 5.0 release (the cctools-211 release): - Integrated changes to allow teflon builds (RC_OS=teflon or RC_OS=nextstep) to not build shlib_ofiles in the Makefile. Also changes in the sources to not include for __TEFLON__ builds. Changes for the 5.0 release (the cctools-210 release): - Changed the default starting address for ppc to 0 (layout.c). - Changed m98k to ppc. Changes for the 4.2 release (the cctools-209.1 release): - Added -image_base as the same as -seg1addr. Changes for the 5.0 release (the cctools-208 release): - Added code to prepend the value of the environment variable NEXT_ROOT to the standard paths if it is set. This is to support the TEFLON cross build environment. All changes are in ld.c Changes for the 4.2 and 4.1 patch release (the cctools-207 release): - Ifdef'ed out the warning about an archive library following a dynamic shared library. This is so that libcc_dynamic.a will not produce this warning when it is linked into all images. Changes for the 4.2 release (the cctools-205 release): - Added telling PB "Architecture Mismatch" when a error for -arch_errors_fatal gets printed. (bug #74032) Changes for the 4.2 release (the cctools-204 release): - Fixed a typo in an error message in pass1.c. "prebinding disabled because of symbols overridded in dependent dynamic shared libraries" where "overridded" was changed to "overridden" (bug #71334). Changes for the 4.0 release (the cctools-201 release): - Changed internal_rld_load() to call the constructors (and profiling stuff) only if the base file is the executable. This was causing the debugger to crash when debugging a bundle with C++ constructors (bug #66200). Changes for the 4.0 release (the cctools-200 release): - Changed fine_reloc_output_address() to not cause an internal error when you have a fine reloc for a non-lazy symbol pointer section. This can result with private externs and doing an ld -r first and then doing an ld on the result (bug #65823). Changes for the 4.0 release (the cctools-199 release): - Fix to bug fix 65292 in cctools-197 which was still wrong and causing all programs with these warnings to be fatal because error() was called and not warning(). More logic was added to fix this (bug #65633). Changes for the 4.0 release (the cctools-198 release): - Fix to ld that bug fix 65292 introduced in cctools-197 which was causing -fvmlibs to fail to build because of prebinding warnings (bug #65451). Changes for the 4.0 release (the cctools-197 release): - Changed ld so that when prebinding is being done and -U's are used for allowed undefined symbols these symbols are printed if prebinding is being disabled because of undefined symbols (bug #65292). - Changed ld so that the warning message "ld: warning using file: x for reference to dynamic shared library from: y because no -dylib_file specified" because it is felt to be distracting (bug #65276). Changes for the 4.0 release (the cctools-195 release): - Fixed a bug reset_prebound_undefines() when dealing with indirect symbols that are defined when prebinding. The desc field should not have been changed as it changes the type of reference (lazy or non-lazy) as well as the REFERENCED_DYNAMICALLY bit (bug #64885). Changes for the 4.0 release (the cctools-192 release): - Changed the default header pad from 0 to the sizeof a section struct so that /bin/objcunique can always add a section header (bug #63516). Changes for the 4.0 release (the cctools-176 release): - Change the default protection to not include execute unless the segment contains sections with instructions. Also don't set execute on the linkedit segment (bug #58445). Changes for the 4.0 release (the cctools-175 release): - Disabled prebinding if -dynamic not set. Also don't use LD_PREBIND if -r is set to avoid warnings. Changes for the 4.0 release (the cctools-174 release): - Added building dynamic_ofiles for the lib_ofiles (RC bootstrap) target in the Makefile. Changes for the 4.0 release (the cctools-173 release): - Disallowed -prebind with -bundle. - Added the setting of -prebind via the environment variable LD_PREBIND. - Added the LC_PREBOUND_DYLIB load command to record which modules were linked from a dynamic library that was prebound. - Fixed a bug when an N_INDR symbol chain had symbols from both dylibs and non-dylibs. The specific problem was when -i_os_fcvt:_fcvt was on the command line and there was an object in the dynamic libsys that defined _fcvt as an indirect for __fcvt. Then both the indirect symbol table entry for _os_fcvt and the symbol table entry for _os_fcvt were bad because the symbol _fcvt from the dylib does not appear in the output file. To fix this a structure of pairs of merged_symbols and indr_symbols was created in reduce_indr_symbols() and used in output_merged_symbols() and merge_indirect_sections(). Changes for the 4.0 release (the cctools-172 release): - Fixed a bug in count_relocs() where it should not have reduced the N_INDR symbol if it was defined in a dylib (line 2720 in sections.c). - Changed it so that when prebinding an executable the local relocation entries for lazy symbol pointers are saved. This must be done even if prebinding fails after indirect_section_merge() has been call so that the number of relocation entries does not change after layout. This effected layout.c by setting the new boolean save_lazy_symbol_pointer_relocs to the value of prebinding just before merge_literal_sections() is called. Then this boolean is used in indirect_section_merge() and reloc_output_for_dyld() to count and put out the relocation entries. - Fixed a bug in all the *_reloc.c relocation routines when updating the relocation entry. The problem was when the relocation entry was an external and the merged symbol was a prebound undefined (N_PBUD) the relocation entry should not have been turned into a local relocation entry. - Changed the checking that prebinding_check_for_dylib_override_symbols() does to only fail if the symbol is overridden and the the symbols is referenced in a dylib. To do this the routine check_dylibs_for_reference() was added and called from check_dylibs_for_definition() in pass1.c. Changes for the 4.0 release (the cctools-171 release): - Fixed a in indirect_section_merge() in indirect_sections.c at line 277 where if the symbol is an N_INDR and not defined in a dylib the indirection needed to be reduced so the setting of indirect_defined is done correctly (bug #57113). Changes for the 4.0 release (the cctools-170 release): - Picked up a bug fix to sparc_reloc.c for SPARC_RELOC_HI22_SECTDIFF where immediate did not have value added to it but rather an incorrect expression. - Added prebinding_check_for_dylib_override_symbols() to check when prebinding that no symbols in dependendent dylibs are overridden and if so disable prebinding and print a warning. The call in made in layout.c and the routine is in pass1.c (since the searching stuff for dylibs in in there). - Overlap checking of dylibs and the program being linked was added by first changing check_overlap() to take the bool argument prebind_check and if it is FALSE to do as it did and if TRUE print the over lap as a warning why prebinding is being disabled. Second check_for_overlapping_segments() adding the dylib segments to the list if prebinding and adding a loop to check the segments with check_overlap() and prebind_check == TRUE. - To allow prepare for overlap checking of dylibs and the program being linked: add_dylib_segment() was added to dylibs.c. Then search_dynamic_libs() a had loop added to it to collect dylib segments. - To allow prepare for overlap checking of dylibs and the program being linked process_undefineds() was broken up so the the reseting of prebound undefineds is now done in reset_prebound_undefines(). So reset_prebound_undefines() is called after layout_segments() where overlap checking will be done and may disable prebinding if there is overlap. This turned up three problems. The first in assign_output_symbol_indexes() which needed to treat N_INDR from a defined in a dylib as an undefined symbol (this same problem was in count_relocs() and in one missed place in indirect_section_merge(). The second in count_relocs() which needed to treat an N_PBUD as an undefined symbol. - Fix the problem with "link order" object for dyld output file being "loaded" twice warning when scattered loading. This was a result of the common object and the module for the dylibs having the same name. The change was to add quotes around the name "\"link order\"" for the common object so they would have different names. - Changed scatter_copy() in sections.c to do the same for lazy symbol pointer sections as for non-lazy symbol pointer section if prebinding. That is use the value of the indirect symbol. This also required an if prebinding == TRUE to be or'ed with indirect_defined test. This also gets the value's of non-lazy symbol pointer set when prebinding. - Changed the *_reloc.c routines for external relocation entries to use the n_value of the symbol for MH_DYLIB's when prebinding. When updating the non-scattered local relocation entries if prebinding and it is a lazy symbol pointer section the relocation entry is turned into a _PB_LA_PTR relocation type with the non-prebound value of the lazy symbol pointer saved in r_value. - Turned off prebinding in process_undefineds() in symbols.c when there are undefined symbols and print a warning. Then if prebinding is still in effect the undefined symbols are not turned back into undefined symbols but left as prebound undefined symbols. - Turned off prebinding when in search_dynamic_libs() when open_dylib() fails to open a dependent dynamic library and print a warning. Also turned off if a dependent dynamic library is not prebound and print a warning. - Turned off prebinding when -undefined suppress is set in ld.c and print a warning. - Added -prebind and -noprebind options to ld.c and the global prebinding. Changes for the 4.0 release (the cctools-169.2 release): - Fixed a bug in the hppa relocation for JBSR's with fine relocation. The fine reloc case was missing the check for r_extern == 1 in the case of MH_DYLIB which the non fine reloc case had (line 735). Changes for the 4.0 release (the cctools-168 release): - Added creating a symbolic link to dynamic_profile_obj from profile_obj. - Added an optional suffix to "-framework Foo,suffix" which first searches for the framework with the suffix and then without. - Change the version numbers of dynamic library to the form X[.Y[.Z]] to match how next does versioning of it's projects. This effected libtool(1), ld(1), otool(1), dyld, libstuff(version_number.c) and man pages for ld and libtool bug #55627). In here the changes were in ld.c . Changes for the 4.0 PR1 release (the cctools-166.3 and cctools-167 releases): - Changed the merge_symbols() routine to propagate the REFERENCED_DYNAMICALLY bit from undefined symbols in to the merged symbol table. This is used to solve the problem with the symbols in crt1.o (and __mh_execute_header) in a dynamicly linked program where they are used by libsys via _dyld_lookup_ and_bind() but get stripped by strip(1) because they don't have the REFERENCED_DYNAMICALLY bit set. This also requires crt1.o to have this bit set for the symbols it defineds and for __mh_execute_header. Which is done with the .desc assembler directive (bug #54660). Changes for the 4.0 PR1 release (the cctools-166.1 and cctools-167 releases): - Fixed a bug in lookup_symbol where the test case for the internal error of the lookup failing was off by one (bug #53390). Changes for the 4.0 release (the cctools-166 release): - Changed the reference to NXArgv and _mh_execute_header in rld.c to use _dyld_lookup_and_bind() in the case of __DYNAMIC__ . - Changed the use of the cpp macro DYNAMIC (set by the Makefile) to __DYNAMIC__ (set by the compiler when -dynamic is in effect). - Removed -fomit-frame-pointer because of compiler bug with -dynamic (bug #52986). Changes for the 4.0 release (the cctools-164 release): - Fixed a bug in output_flush() in pass2.c that was causing the internal error "first block written_offset not 0" in final_output_flush(). The fix to output_flush() was to not set written_offset to the rounded offset, but rather zero, when the offset is less than the pagesize and nothing got written from the block. This happens only for the first page. - Added the -arch_errors_fatal flag to make mis-matching architectures errors fatal. Changes for the 4.0 release (the cctools-163 release): - Changed the default to -dynamic. This is done in ld.c with: enum bool dynamic = TRUE; Changes for the 4.0 release (the cctools-161 release): - Added in the Makefile passing -DDYNAMIC for things built with -dynamic Then ifdef'ed out some const's in section.[ch] and symbols.c with DYNAMIC so that when this is put in a dynamic shared library it does not have relocation entries in a read-only section. - Fixed a bug that caused the error message that an indirect symbol could not be a private_extern symbol when -keep_private_externs was on with -r. The fix was in indirect_sections.c where the if condition for the error checked for private extern bit this "(...nlist.n_type & N_EXT) != N_EXT" condition was also added. - Added checking for relocation entries in read only sections when the output is for the dynamic linker. This is controled by the flag -read_only_relocs which takes arguments {error,warning,suppress} where warning is the default. This checking is done in reloc_output_for_dyld() in sections.c and has some functions in symbols.c to clear and flag symbols based on a bit in the merged symbol structure. Changes for the 4.0 release (the cctools-157 release): - Fixed a bug in ld that caused dynamic libraries built with dependent dynamic librarys to have bad table of contents. Changes for the 4.0 release (the cctools-154 release): - Added marking symbols defined in the output file referenced from a dylib with REFERENCED_DYNAMICALLY in the n_desc field. Changes for the 4.0 release (the cctools-153 release): - Fix a problem with the cctools-151 change that showed up in indirect_section_merge() because it was checking the section's flags for correctness and the "link editor" created object did not copy the flags. So the quick fix was to add if s->size == 0 then return. Changes for the 4.0 release (the cctools-152 release): - Fixed an error check in check_cur_obj() in pass1.c() that was checking the irefsym field of a module table entry against size of the symbol table instead of the size of the reference table. Changes for the 4.0 release (the cctools-151 release): - Fixed a bug in setting the value of non-lazy pointers for link editor defined symbols. The problem was that indirect sections were merged before the link editor defined symbols were set up so the appeared to not be defined and their value was never set in the non-lazy pointer. The fix was in layout.c to just reorder the calls setup of these symbols before the merge of literal sections. Changes for the 4.0 release (the cctools-150 release): - Changed the profiled objects to be compiled with -dynamic. - Changed everything to use __private_extern__ . - Changed to allow private externs without the -dynamic flag. - Added a check in indirect_section_merge() to treat an indirect symbol that turns out to be a private extern as an error. - Added a vm_protect() call for the rld memory to turn on execute protection. This is needed as the kernel has changed to not include VM_PROT_EXECUTE on vm_allocate()'ed memory. Without this it fails on the hppa which uses this in it's hardware (bug #50860) Changes for the 4.0 release (the cctools-149 release): - Fixed a problem with standard_framework_dirs[] that the strings did not contain a trailing /. - Added the -filelist list[,dirname] option to ld (bug #50779). - Added the -bind_at_load option that marks the output with MH_BINDATLOAD in the mach header. This is not allowed for dynamic libraries. Changes for the 4.0 release (the cctools-148 release): - Changed how the librld builds. It now builds 4 objects. One for the following uses: static, dynamic, profiled and shlib. Also added the -static flag to sarld building. - Fixed a bug in fine_reloc_output_sectnum() in objects.c returned the wrong section number where if an indirect section's relocation entry refered to an merged_symbol who's n_type was N_INDR and the indirection was not removed. This resulted on getting an internal error in output_section() for the count of local relocation entries. This was found when linking dyld when it was compiled with -dynamic. Changes for the 4.0 release (the cctools-147 release): - Changed -framework Foo and removed the .dylib at the end of the name to be search for. - Fixed yet another problem with not getting the local relocation entrys right when output_for_dyld. The problem was that code that was added in count_reloc() to fake the relocation to get the correct resulting r_symbolnum was not working. In merge_section() only S_SYMBOL_STUBS sections were getting ms->output_sectnum set to 1 (a non-NO_SECT value) when all sections needed this. So this is now done for all sections. Changes for the 4.0 release (the cctools-146 release): - Fixed a bug in linking dylibs across byte sex. The symbol table was not swapped before it was used in searching in pass1. This was added and a check for MH_DYLIB was added in symbols.c to not swap it again. - Fixed a problem where creating sparc binaries on a little endian machine did not get the 6 reserved bits of the psw correct. The fix was in libstuff swap_sparc_thread_state_regs() (bug #49685). This was CCC approved for 3.3risc and a cctools-142.1 clone with just this fix was submitted. Changes for the 4.0 release (the cctools-144 release): - Fixed a bug in in -preload introduced in cctools-143 when support for undefined checking against dylibs was added. Changes for the 4.0 release (the cctools-143 release): - Added support for undefined checking against dylibs. - Made a change to parse_order_line() in sections.c to parse out an objective-C symbol name differently to handle the problem with 3.2 C++ compiler where the symbol name (McCaw's problem). This should not really be in 4.0 as the 3.3 and later C++ compilers do not have this problem. - Fixed a bug in rld code in remove_objects() in objects.c where cur_obj was being used instead of object_file to test for the undefined_list and free it. Changes for the 4.0 release (the cctools-142 release): - Fixed the call to pass1() in rld.c to added the extra argument for frameworks. Changes for the 4.0 release (the cctools-141 release): - Made ld search all frameworks specified with -framework (e.g. -framework Foo) in the framework search path as Foo.framework/Foo.dylib. Default path is /LocalLibrary/Frameworks, /NextLibrary/Frameworks . Additional search directories can be specified with -Fdir . - Added the -no_arch_warnings for libtool to use which prevents warnings for file which don't have the correct architecture for the -arch flag. - Fixed an edge case in all relocation routines for scattered relocation entries where the last address past then end of the last section is referenced. In this case it was getting an out of range error when infact an address could be referenced as the last address of all of the sections if a lable exist with no data following it. - Fixed the spelling of "compatibility" in the compatibility_version for dylibs. - Fixed a bug in hppa_reloc() for MH_DYLIB files where a check on line 914 was checking merged_symbol's type without checking r_extern == 1 to see if merged_symbol was valid (bug #48008). Changes for the 4.0 release (the cctools-140 release): - Picked up sparc changes to sparc_reloc.c which fixes scattered relocation problems. Changes for the 4.0 release (the cctools-138 release): - Added the MH_BUNDLE object file type to be used with NSLinkModule(). - Fixed a bug in reporting common symbols for -dylib where the wrong object file was referenced. The fix was in merge_symbol() when an merged symbol changes from an undefined to a common the definition_object needed to be assigned to the current object. - Fixed a bunch of bugs in getting the right relocation entries out for ld -r with indirect sections. The approach now taken is to relocate all things who's contents are not used in the output to past the end of the section and then the r_address after relocation can be used to determine if the relocation entry is to be saved. Changes for the 4.0 release (the cctools-137 release): - Picked up sparc_reloc.c. - Added the -Y n flag to print n references to undefined symbols (bug #46166). - Fixed a problem with parsing -dynamic which ate the next argument (crt1.o in the case used by the driver). - Fixed a bug when using -output_for_dyld and libsys local relocation entrys were not correct because a local relocation entry to a symbol stub that is eliminated because the symbol is defined as an N_ABS symbol causes the relocation entry to be need to be saved even though it started out as a local r_pcrel but now refers to an N_ABS symbol. The fix was in count_reloc() in sections.c to fake doing the relocation on such an item to get the correct resulting r_symbolnum (which in this case is N_ABS) which will then be used to determine if the relocation entry is pic. - Fixed a bug in sparc_reloc() for the SPARC_RELOC_WDISP30 relocation type for scattered loading which was a copy and paste error that did not set "value" but rather "offset" when picking up the item to be relocated for a local relocation entry with fine relocation. Changes for the 4.0 release (the cctools-134 release): - Fixed a bug in ld -M in printing the map that core dumps. There was a use of cur_obj in a couple of places that should have been object_file in layout.c when testing the dylib and dylinker fields (bug #44619). Changes for the 4.0 release (the cctools-133 release): - Picked up sparc changes to layout.c for the name changes of the sparc thread. - Fixed a bug in fine_reloc_output_address() in object.c that was testing for non-lazy not lazy section pointers and cause a fatal internal error when a defined symbol had a symbol stub entry and a lazy symbol. - Changed it so that undefined symbols are not allowed if the output is a dynamic linker. - Fixed a bug in rld that didn't get the alignment right because the header_size was not rounded to the maximium section alignment which was used as the starting address (bug #44241). - Added three Project builder messages, "Link errors", "Undefined symbols" and "Multiply defined symbols" to ld (bug #40745). - Fixed a bug for hppa in the relocation for JBSR's in MH_DYLIBS for external relocation entries. This should not have relocated a JBSR to the defined external for MH_DYLIBS if the symbol was not a private_extern. Changes for the 4.0 release (the cctools-132 release): - Picked up sparc changes to sections.c for sparc relocation. - Picked up sparc changes to layout.c for sparc thread. - Picked up new sparc files sparc_reloc.h and sparc_reloc.c and change the Makefile. - Added -dynamic to eventually replace -NEXTSTEP-deployment-target 3.3 and -static to eventually replace -NEXTSTEP-deployment-target 3.2. Changed all the incompatiblity error messages to use -dynamic. - Removed the private externs from the toc for dylibs and desided to leave them in the reference table. They could be pulled from the reference table but then it would be harder to size and construct it as it would take another pass to determine if an undefined symbol mached up with a private extern. This still could be done later if space is an issue. It also could be an issue if a library module with private externs wants to be unloaded or replaced which may not be possible. - Changed the way private externs are handled. Now the N_PEXT is never turned off and symbols with this bit are always saved with the -x flag. This effected a number of places. Also changed was the handling of non-lazy pointers to allow private externs as the indirect symbol. This allowed a non-external symbol (that was previouly a private extern) to be an indirect symbol. This caused all sorts of changes to indirect symbols and the handling of fine relocs. - Changed hppa_reloc()'s handling of JBSR relocs for output_for_dyld for JBSR undefined symbols. In this case the bl instruction is not changed so that it will continue to point at the long branch stub (which in the case of output_for_dyld should be targeted at symbol stub). - Fixed a bug in hppa_reloc() for ld -r of JBSR reloc types for external relocation entries turning into local when the symbol was defined as a private extern with the N_SECT type. The problem was that n_type & N_TYPE was not used but rather n_type == (N_EXT | N_SECT) when testing to determine if the other_half needed to be adjusted. This same problem shows up in many other places which have been corrected. - For the hppa corrected the output when the output is for dyld so JBSR relocs are never in the output. This effected count_relocs() and reloc_output_for_dyld() in sections.c . Changes for the 3.3 release (the cctools-130 release): - Fixed a problem with the CATS bug fix. In remove_set() in sets.c it was doing a free() of the data structures not a memset() back to zero. Changes for the 3.3 release (the cctools-128 release): - Removed the make app stuff (bug #40745) effected ld.c. - Fixed an rld bug that CATS software found when loading more than 10 objects with commons. The bug was that the sets data structure was being realloced after 10 rld_load()'s and the merged_symbol structure for previous loaded common symbols had a definition_object pointer pointing to the old memory. The fix was to change the sets data structure and change the three structs in there to pointers to pointers to structs and allocate each of those structs. Effects sets.c sets.h symbols.c (bug #42703). - Fixed a bug in rld where in set_merged_string_block_indexes() in pass2() was not being called because it got if'ndefed RLD out (bug #42283) introduced in cctools-122. Changes for the 3.3 release (the cctools-127 release): - Changed the order of the symbol information to optimize dyld's memory use. strip(1) has been changed to handle this new order. - Fixed a bug where ld -r for indirect sections would not get the relocation entries put out. The bug was in scatter_copy_relocs() that was calling fine_reloc_offset_in_output() which should have been calling fine_reloc_offset_in_output_for_output_offset(). Then the problem was that fine_reloc_offset_in_output_for_output_offset() was not mapping to the correct fine_reloc for use_contents == 0 because the output_offset was relocated using a fine_reloc that it's output_offset did matter and was zero. This caused fine_reloc_offset_in_output_for_output_offset() not to map the relocated output_offset back to the correct fine_reloc. The fix to this problem was to set output_offset in all the fine_relocs with use_contents == 0 before relocation to the output_section's size so later the correct fine_reloc would be mapped to and use_contents will have 0 for these. This is done in output_section() in sections.c if the output is relocatable and it is for an indirect section. - Changed the thread command of a MH_DYLINKER from a LC_UNIXTHREAD to an LC_THREAD (bug #42338). - Fixed a bug where for MH_FVMLIB and MH_DYLIB formats commons were not traced when found in define_common_symbols(). I removed the if test that caused this routine to return for these formats I mistakenly added and not to drop in to the loop to define them and also to trace the symbols. Changes for the 3.3 release (the cctools-125 release): - Changed the temporary warning "current limitation: dynmaic linker used so undefined symbols not reported" in layout_merged_symbols() in symbols.c to not dependend on using a dylib but just rather having a dynamic linker command and being output for dyld. Changes for the 3.3 release (the cctools-124 release): - Temporarily added a the warning "current limitation: dynmaic linker used so undefined symbols not reported" in layout_merged_symbols() in symbols.c. - Added allowing fat object files in archives when -all_load is specified. This was done in pass1_archive() in pass1.c. This was added to allow libtool to use it when creating libs with -dynamic. - Added a check for private externs if the deployment target is 3.2 to flag it as incompatable. - Changed define_common_symbols() in symbols.c to defined commons for when output_for_dyld is TRUE. Changes for the 3.3 release (the cctools-122 release): - Fixed a bug where the module names of a dylib did not have the right indexes. The assignment of merged string blocks index's was moved from the function output_merged_symbols() into a new function set_merged_string_block_indexes() and called in pass2.c before output_dylib_tables(). - Fixed a bug in reloc_output_for_dyld() for indirect sections where the call to fine_reloc_offset_in_output() did not work because the r_address had been relocated to the output address. So a new function that takes an output_offset, fine_reloc_offset_in_output_for_output_offset(), was written and is now used. This caused local relocation entries to be missing and the link editor to get an internal error. - Fixed a bug in merged_symbol_string_index() for rld which was crashing when things got unloaded because the static var saved a pointer to a deallocated string block (bug #41376). - Added the -NEXTSTEP-deployment-target flag. Also added -k that implys 3.3. - Added a bunch of checks based on the deployment target in the area of what flags could be used (-dylib, etc) and checks for new sections in the input files. Also added for deployment on 3.2 the removal of section attributes so PURE_INSTRUCTION objects just work. - Added searching for libx.dylib for -lx if deployment is not 3.2. Changes for the 3.3 release (the cctools-120 release): - Fixed a bug in fine_reloc_output_address() in objects.c when a symbol stub's indirect symbol table is for an N_INDR symbol the chain through the n_value being a (struct merged_symbol *) was not followed. - Fixed a bug when building MH_DYLINKER format where setup_link_editor_symbols() should not have incremented dysymtab_command.nextrefsyms for MH_DYLINKER but only for MH_DYLIB. This causes a flush overlap error. This fix is needed to build the dynamic linker. - Fixed a bug where the indirect symbol table was not swapped on cross links for differing bytesex. The swaping was added in check_cur_obj() in pass1.c as well as checking each entry that it is in range. - Fixed a in all the *_reloc() routines with respect to relocating a sectdiff entry where one of the values has fine relocation. The bug was that the value that didn't have the fine relocation did not have it's *_map->offset (the offset into the output section where this object file's section starts) added in to calculate it's value. This effected all *_reloc.c routines (except i860_reloc.c which has no fine relocs). - Fixed a bug in generic_reloc() when pcrel_at_end_of_disp is TRUE (the i386 case) for a pcrel external relocation entries in calculating the offset in the item to relocated. Which is used to decide to create a scattered or local reloc. This caused a flush overlap error when the relocation entry was tried to be created that was not to be there for output_for_dyld. Changes for the 3.3 release (the cctools-119 release): - Fixed the rld bug where C++ constructors/destructors were not called. The fix is at the end of the internal_rld_load() where the it loops through the section and does the call or registers it with atexit() (bug #40616). - Added the S_ATTR_EXT_RELOC and S_ATTR_LOC_RELOC attributes to sections so the dynamic linker can determine if it needs to vm_protect() it's segments. This Was added in count_relocs() and layout_relocs_for_dyld() in sections.c. Changes for the 3.3 release (the cctools-118 release): - Fixed a bug that when an "ld -arch xx -ifoo:bar" was done the target byte sex was picked as the host bytesex not based on the -arch flag. The fix was in ld.c to set target_byte_sex when a -arch flag was seen and later to not set it to the host_byte_sex if a -arch flag was specified. Changes for the 3.3 release (the cctools-117 release): - Fixes a bug in assign_output_symbol_indexes() in symbols.c for RLD which got the internal error "internal error: assign_output_symbol_indexes() inconsistent local symbol counts" because the loop that sets the indexes for the local symbols did not have an ifdef RLD for skiping the objects not in the current set. Changes for the 3.3 release (the cctools-116 release): - Fixed a bug in layout() that did not allow an entry point if the first segment did not have any non-zerofill segments and a -e option was specified. Changes for the 3.3 release (the cctools-115 release): - Fixed what was included for the SA_RLD code so the the time() and qsort() functions are not needed. Dis-allow all indirect sections for SA_RLD code which allows merged_symbol_output_index() not to be needed and the symbol table not to be ordered so qsort() in not needed. The need for time() was because of time stamp for creating dylibs which was ifdef'ed SA_RLD out. - Fixed a bug in legal_reference() in indirect_sections.c to allow references to a symbol stub section not at the start of the stub by the symbol stub itself which is what happens in pic symbol stubs. - Made a change to what is allowed for indirect symbols. Previously only undefined external symbols were allowed. Now 1) Any external symbol is allowed as an indirect symbol (even if defined) 2) A local symbol is allowed as an indirect symbol for a symbol stub and lazy pointer section (which the stub and pointer will then always get removed). Changes for the 3.3 release (the cctools-114 release): - Fixed a bug introduce in cctools-112 with command line created symbols, -i options, that produce warnings when scatter loaded because the object file "command line" was multiply loaded. - Fifth major round of changes for the new shlib stuff. 1) Added the code to produce and link with the dylinker format. 2) Added the code to link with the dylib format (for now only the load command is copied to the output file). 3) Added the optimization to the link editor to use the value of the symbol for a non-lazy pointer section if it is defined. This will allow the compiler code generation to be developed and tested without the dynamic linker). Changes for the 3.3 release (the cctools-113 release): - Fixed a bug introduced in cctools-112 in outputing the relocatation entries for S_LITERAL_POINTERS sections. Both ld -r and ld -output_for_dylib were broken. The problem for ld -r was the counting of the relocation entries for literal pointers was wrong. A new routine, count_relocs, was added in literal_pointers.c based on if the literal pointer as newly seen. Changes for the 3.3 release (the cctools-112 release): - Fixed a bug in the hppa reloc for scatter loading BL17 relocation types that was always 8 past the target. "value -= 8;" was added in the local reloc case with fine relocs. - Forth major round of changes for the new shlib stuff. 1) Added the code to produce the dylib format. New tables and relocation info changes. Changes for the 3.3 release (the cctools-108 release): - Third major round of changes for the new shlib stuff. 1) Added the code to order the symbol table and string table. Changes for the 3.3 release (the cctools-104 release): - Second major round of changes for the new shlib stuff. 1) Added support for indirect sections and relocation to them when indirect symbols get defined. - Fixed a bug with the hppa JBSR reloc types (mostly when saving relocation entries, scattered loading and non-zero based sections). - Found and fixed a bug in the 3.2 released link editor. This bug happens when relocation entries are saved and there are scattered relocation entries which reference a section with fine relocation the r_value field is not updated correctly. The code was: sreloc->r_value = fine_reloc_output_offset(local_map, r_value - local_map->s->addr) + local_map->output_section->s.addr + local_map->offset; which was corrected to: sreloc->r_value = fine_reloc_output_offset(local_map, r_value - local_map->s->addr) + local_map->output_section->s.addr; as the value of local_map->offset should not have been added. Changes for the 3.3 release (the cctools-103 release): - Removed the "__attribute__ ((format (printf, 1, 2))" from vprint in ld.h as it was incorrect and the new compiler treats this as an error. Changes for the 3.3 release (the cctools-102 release): - Integrated in the hppa support. * Added the SECTDIFF support for the hppa with the HI21 and LO14 SECTDIFF relocation types. * Fixed the use of calc_hppa_HILO() in hppa_reloc() in hppa_reloc.c to correctly pass the symbol value and offset value as the two first parameters. different ld/Makefile (integrated for cctools-102) Using cctoolshppa-37. New hppa files. different ld/layout.c (integrated for cctools-102) Using cctoolshppa-37. hppa thread stuff. different ld/ld.h (NOT picked up for cctools-102) Using cctoolshppa-37. The define CHECK_PRINTFS is ifndef'ed out hppa with the comment /* va_list defined differently for hppa. Check this */ different ld/notes Using cctools-29. Late 3.2 fixes the hppa base did not have. different ld/pass1.c Using cctools-29. Late 3.2 fixes the hppa base did not have. different ld/rld.c Using cctools-29. Late 3.2 fixes the hppa base did not have. different ld/sections.c (integrated for cctools-102) Using cctoolshppa-37. hppa reloc call based on cpu type. Only in cctoolshppa-37/ld: hppa_bitfuncs.c (NOT picked up for cctools-102) Pickup cctoolshppa-37/ld/hppa_bitfuncs.c from cctoolshppa-37. Only in cctoolshppa-37/ld: hppa_bitfuncs.h (NOT picked up for cctools-102) Pickup cctoolshppa-37/ld/hppa_bitfuncs.h from cctoolshppa-37. Only in cctoolshppa-37/ld: hppa_reloc.c (integrated for cctools-102) Pickup cctoolshppa-37/ld/hppa_reloc.c from cctoolshppa-37. Only in cctoolshppa-37/ld: hppa_reloc.h (integrated for cctools-102) Pickup cctoolshppa-37/ld/hppa_reloc.h from cctoolshppa-37. Changes for the 3.3 release (the cctools-101 release): - Added code in the reloc routines to check that byte and short relocation fits. Changes for the 3.3 release (the cctools-100 release): - First major round of changes for the new shlib stuff. 1) Support for spliting the sections flags field in to types and attributes. Lots of places that used flags now use (flags & SECTION_TYPE). 2) Support for possition-independent code through the SECTDIFF relocataion type. This effected all the *reloc.c sources. 3) Support for .private_extern directive with -keep_private_externs. Where the change from external to static happens in in layout_merged_symbols() in symbols.c. Changes for the 3.1 release (the cctools-28 release): - Fixed a bug where pass1_fat() cleared the error variable and caused multiple defined errors not to cause the link editor to exit and instead produce an output file (bug #37043). Changes for the 3.1 release (the cctools-27 release): - Fixed a bug in sarld's vprint() which did not advance the error buffer correctly. Changes for the 3.1 release (the cctools-25 release): - Fixed bug #36216 which did not issue a warning when -Ldir's don't exist. - Added stand alone rld as libsarld.a which is supported by the ifdef SA_RLD. Changes for the 3.1 release (the cctools-20 release): - Changed the m98k seg1addr to 0x13a00000 for the m98k (-object too). Changes for the 3.1 release (the cctools-19 release): - Fixed a bug in output_literal_pointers() that was not swapping correctly. The problem was it was using set_long() which used cur_obj->swapped but at this point in the code cur_obj is not set. So the change was to do the swaping based on host_byte_sex != target_byte_sex. Changes for the 3.1 release (the cctools-16 release): - Fixed a bug in the checking of BR24 relocation where a mask was 0xf8000000 which should have been 0xfc000000. Thus when a displacement of 0x04000000 or greater was generated the relocation overflow was not caught. - Changed the default seg1addr used for the m98k to 0x10000000 (which should be VM_MAX_ADDRESS in mach/m98k/vm_param.h but would require files to include that file). This change was made in layout_segments() in layout.c. Changes for the 3.1 release (the cctools-15 release): - Changed not finding an arch in a fat file to a warning from an error and not finding an arch from a thin archive to a warning from an error (bug #30659). - Fixed a bug in m98k_reloc() where HA16 was not relocated correctly because a constant was written 0x000080000 not 0x00008000 (has an extra 0 on the end). Changes for the 3.1 release (the cctools-13 release): - Added the m98k (PowerPC) architecture. This includes a kludged mach/m98k/thread_status.h with only an entry point. Changes for the 3.1 release (the cctools-10 release): - Changed the handling of the cpusubtypes to support this design: The design allows each architecture family (m68k, m88k, i386) to have a cpusubtype that will run on all implementations of that architecture and have cpusubtypes that will run only on specific implementations of an architecture. The design also gives the programmer the option to force the cpusubtype indicating all implementations (at build time with a flag) when using instructions that are implementation specific leaving it up to the program to runtime select the correct code to execute. The link editor operation in this design: By default the link editor will change it's operation (starting with cctools-10) as specified on the ld(1) man page from: If no -arch arch_type is specified and the first object file encountered on the link line is a "fat" file the output architecture is as follows: if the fat file contains only one architecture then that architecture is used else if the ``fat'' file contains the host architecture then the host architecture is used otherwise it is an error and an -arch arch_type must be specified. to: If no -arch arch_type is specified and the first object file encountered on the link line is a "fat" file the output architecture is as follows: if the fat file contains only one architecture then that architecture is used else if the ``fat'' file contains the an architecture that would execute on the host then the "best" architecture as defined by what the kernel exec(2) would select is used otherwise it is an error and an -arch arch_type must be specified. In addition the cpusubtype will be promoted from an ALL subtype to a specific cpusubtype if an object file with a specific cpusubtype is linked in and the resulting linked object file will have that specific cpusubtype. As this promotion occurs during the linking this effects the selection of which component of a fat file will be selected for linking for subsequent fat files encountered on the link line. When a -arch arch_type flag for an architecture family (m68k, i386, etc) is specified it has the effect as if the link editor is linking for that host architecture and the cpusubtype will be promoted as described above. If a -arch arch_type flag for a specific implementation of an architecture (m68040, i486, etc.) is specified the result is an object file with that specific cpusubtype and any object that has a cpusubtype which will not promote to the cpusubtype for that -arch flag is an error. The link editor will also accept the optional -force_cpusubtype_ALL flag causing the cpusubtype to remain ALL an not be promoted. This flag has precedence over any -arch arch_type flag for a specific implementation. Use of this flag has an effect on the selection of which component of a fat file will be selected for linking and the cpusubtype always remains the _ALL type. The link editor will change it's operation in this area (starting with cctools-10): Previously when a fat file was encountered during linking and there was no architecture in the fat file for the current architecture being linked the fat file is ignored without any error or message. This will change to: If a fat file is encountered during linking and there is no "best" architecture in the fat file for the current architecture being linked this is treated as an error. The selection of the "best" architecture will be the same as the kernel's exec(2) and is defined by the library function cpusubtype_findbestarch(). During linking a "current cpusubtype" will be maintained and objects being linked will be combined with it based on the library function cpusubtype_combine() and will produce a new "current cpusubtype" or an error if the cpusubtypes can't be combined. If the -force_cpusubtype_ALL flag is specified the above routine will not be used and the cpusubtypes will always be combined and the "current cpusubtype" will always remain the _ALL cpusubtype. The rld(3) operation in this design: For reasons of compatiblity and existing bugs in the the cpusubtype handling the rld(3) package will function as if -force_cpusubtype_ALL were specified. As of the 3.0 release the rld(3) package does not do the same checking as exec(2) does with reguard to the handling of the cpusubtype. Specificly for the m68k if on an 030 an object file with the 040 cpusubtype is used with the rld(3) package no error is generated. This "bug" has the effect of the functionality of the -force_cpusubtype_ALL flag but lacts the error detection supported by exec(2). Since adding the error detection could break existing uses of rld(3) the rld(3) package will function as if -force_cpusubtype_ALL were specified. This effected ld.c, ld.h, pass1.c and rld.c. Changes for the 3.1 release (the cctools-9 release): - Fixed a bug introduced by adding the -pagezero_size option where -p was not recognized the same as -preload. Changes for the 3.1 release (the cctools-8 release): - Added a "-pagezero_size hex_value" argument at the request of the Lono team. - Changed the default segment alignment to 0x2000 for the I386. This effects check_cur_obj() in pass1.c. Changes for the 3.1 release (the cctools-7 release): - Fixed a bug in cross linking on a risc machine in generic_reloc.h in the {get,set}_{long,short} routines where the compiler was taking the 'long *' and the memcpy() and assuming it could do the copy in line and it was correctly aligned. The change was to make the type a 'void *'. - Changed the way the messages for -sectorder_detail is printed in the case a symbol is not specified in the load file so the output of ld can be cut and pasted into an order file (bug #26204). - Allow multiple -arch flags of the same name (bug #26197). Changes for the 3.1 release (the cctools-6 release): - Added the -arch_multiple flag that will cause one line to printed before all error messages which will contain the architecture name. - Added checks for m88k relocation overflows in m88k_reloc.c for PC16 and PC26. - Maded the changes to handle cross bytesex linking. - Changed the way the non-zero values of the i386 thread_state registers get set from an initialized struct to direct assignment. This was also added to the ifdef RLD code. These are the asignments: intel386.es = UDS_SEL; intel386.ds = UDS_SEL; intel386.ss = UDS_SEL; intel386.cs = UCS_SEL; - Fixed a bug introduce in cctools-5 item: Changed the default order when all the symbols in an object file are not listed in an order file to caused that object to be loaded as it had a .section_all specification (nrw team request). The bug was that if object had a .section_all this new code would reassign the order. Another condition was added to the if that trigers this new code to test for this case. - Fixed a bug in the Makefile when more than on RC_ARCHS was set. The change of "$(RC_ARCHS)" in the for loop to `cat $(RC_ARCHS)` was done to fix it. Changes for the 3.1 release (the cctools-5 release): - Picked up a change from the lono team where the variable named "i386" was changed to "intel386" so that it wouldn't collide with the CPP macro named "i386" in layout.c . - Picked up a fix from the lono team where calculating the output_pc was done incorrectly when doing pc relative offsets for the i386 in generic_reloc.c . - Changed the default order when all the symbols in an object file are not listed in an order file to caused that object to be loaded as it had a .section_all specification (nrw team request). - Fixed a bug where the relocation references in rld to sections with fine relocation entries was wrong because the fine relocation entries were free'ed too soon in pass2() in pass2.c (bug #22046). Changes for the 3.1 release (the cctools-3 release): - Changed the way the default segalign gets set. It is now set when the output cputype is set in check_cur_obj() in pass1.c based on the cputype and not initialized to the cpp macro TARGET_PAGESIZE set via the Makefile but initialized to zero in ld.c. This was done because it is different for the i386 architecture. - Fixed a bug with generic_reloc where the a pcrel relocation entry on the i386 is relative to the end of the displacement not the beginning. This involved adding an extra argument to generic_reloc() and passing the correct argument in sections.c where this is called. - Fixed a bug with librld.o needing to be linked with libstuff.a (Makefile change). Changes for the 3.1 release (the cctools-3 release): - Removed the M88K_TIME_HACK code in pass1.c - Changed CPU_TYPE_I80x86 to CPU_TYPE_I386 in lipo.c Changes for the 3.1 release (the cctool-2 release): - Added support for fat files. The -arch flag was added to help support this. The changes are in pass1.c for the fat stuff. The global variables cputype and cpusubtype are now used out of the global struct arch_flag this effected a hand full of files. - Removed the obsolete flags: -a, -T, -Ttext, -Tdata, -ident, -v, -g, -G, -D. Changes for the 3.0 release (the -57 compiler release): - Corrected the -whyload message in pass1.c for -all_load that printed -all (bug #20024). Changes for the 3.0 release (the -56 compiler release): - Added the -all_load flag that causes all of the members of archives to be loaded. This effected ld.c, ld.h and pass1.c (bug #19644). - Added the -ObjC flag that causes the members of archives that defined objective-C classes or categories to be loaded. This effected ld.c, ld.h and pass1.c (bug #19643). - Added the feature of ".section_offset " in the load order file. This as in layout_ordered_section() in sections.c . - Fixed a bug in in lookup_load_order() in sections.c if the same named symbol appears more than once in the loaded objects (in the case of static symbols) and the sectorder file has that symbol listed more times than it appears in the objects being loaded. So when lookup_load_order() is handed one of the lines for this symbol and all orders for those symbols have been assigned it failed to test for this and incorrectly dropped into the code that was assuming that there was multiple matches for this symbol and tried to return the first non-ordered match. But since all the symbols were assigned there was non first non-ordered match and this caused an indirection through a NULL pointer. So the fix was to add the following code: if(number_of_matches == 0) return(NULL); after the first loop that determined the number of non-ordered matches were left. (found by Stone Design in the 2.1 release) (bug #19640) Changes for the 3.0 release (the -55 compiler release): - Fixed a bug when ordering a section where two symbols had the same value. The problem caused a the block to not be written to the correct output offset leaving a hole of zeros. The fix is to make sure that zero sized blocks get the output_offset size of the previous block. The fix is in sections.c in layout_ordered_section() (see the use of prev_output_offset). - Fixed the spelling of ambiguous in places it appeared abiguous and ambigious (bug #19353) in sections.c. - Added a test to see if an archive member name could have been truncated before printing the warning saying it could be ambigious when used with -sectorder (bug #19352). Changes for the 3.0 release (the -53 compiler release): - For RLD internal_rld_load() in rld.c if the output_file is RLD_DEBUG_OUTPUT_FILENAME (used by the debugger for automatic debugging of rld using the rld_state stuff) the flag RLD_DEBUG_OUTPUT_FILENAME_flag is set so the code in layout_segments() in layout.c will know to pass address_func() the allocate_size (including the symbol table) so the debugger can save this and deallocate the memory correctly. - For RLD in rld.c if the object file name is not a full path the fullpath is created and saved as the object file name. This is so that the debugger can find the object when using the automatic debugging is done using the rld_state stuff. - For RLD changed the enter_symbol() routines to use the string from the object if it is in the base file. - For RLD allocate from an NXZone for all allocations. Changes for the 3.0 release (the -52 compiler release): - Added ignoring the new LC_PREPAGE load command (two places in pass1.c). - Added the Make.app stuff (new files make.defs, make_defs.h, and notifyMake.c) This effected the Makefile and ld.c. Changes for the 3.0 release (the -51 compiler release): - Fixed a bug that did not pad out the string table to a multiple of 4 bytes. A output_strpad field was added to the symtab_info struct which was filled in layout_segments() and the size of the string table was changed to be rounded to 4 byte size. Then the strpad was flushed in setup_output_flush(). This effected layout.c, layout.h and pass2.c. - Changed the m88k thread status to match the kernel struct (layout.c). Changes for the 3.0 release (the -49 compiler release): - Changed where ld3.1 gets installed it now gets installed in /usr/local/bin3.1/ld . - Added LC_FVMFILE to pass1.c to be ignored. - Changed the strip line for librld.o because it strips the rld_state the debugger needs and messes up the debugger when the debugging symbols are saved and some globals are stripped. It now uses nmedit. - Changed the Makefile to meet the RC api. Changes for the 3.0 release (the -47 compiler release): - ld sources split in to ld and ld3.1 and all m88k and ix86 stuff removed. - Added rld_forget_symbol() for Franz Inc. to use with Lisp. - Changed shlib_ofiles and profile_ofiles to build one librld.o object using strip to limit the number of globals to only the api listed on the man page (bug #15808). - Changed the alignment of .section_all blocks from using the merge section's alignment to using the original section's alignment. (sections.c layout_ordered_section() second use of function round()). This allows shlib's to stay compatible when the alignment of an ordered section increases. - Added #include to ld.c to match header file changes. - Changed the includes in layout.c to match the header file changes: m68k/mach/thread_status.h -> mach/m68k/thread_status.h m88k/mach/thread_status.h -> mach/m88k/thread_status.h ix86/mach/thread_status.h -> mach/ix86/thread_status.h i860/mach/thread_status.h -> mach/i860/thread_status.h Changes for the 3.0 release (the -44 compiler release): - Switch over to the new header file organization. This also involed changing thread_status structure names and constants. Changes for the 3.0 release (the -43 compiler release): - Added support for the i386. - Changed rld_load to fail if the output file for the debug file can't be created (bug #14799). - Added rld_loaded_state for the debugger so it can automaticly debug things that use rld (the interface in in the header file rld_state.h) (bug #15163). - Fixed all new warnings with the cc-37 compiler and added the __attribute__ format stuff for all error messages. This involved touching every file and all long declrations to be unsigned long. This also involved touching most error strings for fix up. This did find 6 or so real bugs. Changes for the 3.0 release (the -37 compiler release): - Added a check in pass1.c to check for old 88k objects based on the date this is installed internally to NeXT (Wed Jun 12 16:00:00 PST 1991 (676681200)). This is ifdef'ed M88K_TIME_HACK. - Changed the RLD ifdefs in sections.c and m88k_reloc.c to allow 88k objects to be used with the RLD package. - Removed all #error's and most uses of mc68000 in all the code. The relocation routines now have static inline routines to get/set longs, shorts, and bytes reguardless of the alignment (see generic_reloc.h). Other checking code in pass1.c has also been updated. This effected pass1.c, *_reloc.c and literal_pointers.c - Changed m88k_reloc() to handle scattered relocation and the change of storing the other half in pair relocation entries in the r_address field. - Changed i860_reloc() to handle the change of storing the other half in pair relocation entries in the r_address field. - Fixed a bug in generic_reloc() where if a pc-relative external relocation entry had an offset equal to it's pc and that symbol was defined (in another object being loaded) and relocation entries were saved a local relocation entry would be created where a scattered relocation entry should have been. For this bug to show up an 'ld -r' would be needed and then a scattered load where the symbol+offset did not end up in the same block. The fix was to adjust the offset by the input_pc if the entry was pc-relative. (very obscure bug, found by reading the code). Changes for the 3.0 release (the -36 compiler release): - Fixed an obscure bug when ordering a section where two symbols have the same value. The fix is in qsort_load_order_values() in sections.c . This fix makes the load_orders and the fine_relocs sorted by value end up in the same order even though the load_order sorted by name between their sorts by value. Without this the blocks for the symbols at the same address get placed in the file in the wrong place because the subtraction of their input offsets does not yeild the size of the block in this case. This is kinda a funky fix to avoid adding a size field to the fine reloc struct which would be very expensive in space. - Fixed a bug in create_order_load_maps() in sections.c which used more order_load_maps than it allocated. It used maps for sections that had no_load_order == TRUE. Changes for the 3.0 release (the -34 compiler release): - Fixed a bug where multiple pass1 errors were not processed because the code in merge() in pass1.c always returned if there had been any previous errors. The fix was to have merge() save and restore the previous errors and only return if an error happened while processing that file. (second bug in first released version). - Added the -m flag to allow multiply defined symbols with a warning instead of treating them as a hard error. In this case the first symbol is used for linking and is the value of the symbol. - Added installsrc, installIBMsrc and installGNUsrc targets to the Makefile. - Fixed a bug that would cause the output flush stuff to fail. The problem was when a section in an object file had a size that was not a multiple of its alignment and the next object file loaded with that section had a size of zero the section would be padded to get the alignment but the routine out output the section returned when the size of the section was zero and thus the area was not flushed and ld got an internal error. This was fixed in merge_section() in sections.c where the test for the section size being zero is made and the merged section size (ms->s.size) is not changed if the size of the section being merged is zero. (first bug in first released version) Changes for the 3.0 release (the -33 compiler release): - Added the support needed for the 88k and the i860 processors. - Changed the use of r_reserved field of the relocation_info to match the change to r_type. This effected only generic_reloc.c and literal_pointers.c . Release 2.0 Changes for the Warp ?? release (the -30 compiler release): - Allowed using -sectorder on zero fill sections (including the section for common symbols) and for all literal sections (each type of literal section has it's own format of the sectorder file) (bug #9404). - Improved handling of sectorder file where the specifications don't exactly match the object names of what's loaded. A hash table of symbol names is used to attempt to match up symbol names in the specifications to the symbol names in the object files loaded. Also removed the requirement of a separating ':' between the object name and symbol name which allows just a symbol name to be specified. Also removed the fatal error of the same object file loaded more than once with -sectorder and the same symbol in the same object file. This introduces ambiguity but that exist anyway when the requirement of exact matches was removed. Also improved the allocation of the name arrays data structure for better performance (bug #9403). - Fixed a bug in clean_archives that indexed the sets array with cur_set when cur_set was equal to -1 (bug #9402) - Fixed a bug if any section specification was given for the (__DATA,__common) section it caused the common symbols not to be defined (bug #9401). - Fixed a bug that caused ld to hang if processing an old library and a member had an error in the object file. The fix was to add the expresion errors == 0 to the while loop to terminate the algorithm in the case of an error. The error was that an object contained an LC_SYMSEG which was handled as an error. This is now a warning and the message was changed to include "object produced by pre-1.0 compiler, please recompile" (bug #9141). Changes for the Warp ?? release (the -29 compiler release): - Fixed a bug in new_sets that did not zero out the entire structure when reallocating it (bug #8037). - Replaced the buggy literal pointer code (literal_ptrs.[ch] got literal_pointers.[ch]) (bug #7994). - Changed the sizes of the literal 4 and 8 tables from 20 to 60 which seems to be about the right number of literals so that a large program will have only one table. - Changed the calls to map_fd again to match the current prototype in libc.h which now matches the NeXT documentation. Casts for all the parameters were added. Hopefully this will now remain correct. Changes for the Warp ?? release (the -28 compiler release): - Fixed bug #7770 where the logic around free() in the literal 8,4,pointers free code was wrong. Changes for the Warp ?? release (the -27 compiler release): - The first version of the literal pointers code was added. - Fixed a bug that caused floating-point constants to be relocated wrong. The output_offset for the fine relocation map for the first table entry of all second and larger tables got set wrong. - Fixed a bug where if symbols were being traced with -y and common symbols were being allocated then some of the common symbols might not be allocated. The problem was in defined_common_symbols() where the loop that looped through the trace symbols and the loop that looped through the merged symbol list were using the same variable. - Fixed a bug where the contents of a section was not placed in the output file at the right address. This was caused by an zero sized section that had an alignment that caused it's address to be greater than its previous section. Then when the offsets were assigned to the sections a test for zero sized sections prevented the running "offset" to be incremented if the size of the section was zero even though the difference of the address of the section and the next section in this case was not zero. This showed up with a zero sized literal8 section with rld because the section came from the basefile and was not in the loaded objects. Changes for the Warp 3H release (the -26 compiler release): - Fixed a bug in generic_reloc that produced scattered relocation entries for absolute symbols. - Fixed a bug in the rld package and ld -A where the common section did not have the correct alignment. The problem was in merge_sections if the base file was being merged the alignment was not propagated into the merged section. - Fixed a bug in layout_sections that did not assign addresses to zerofill sections correctly aligned (it was fixed for content sections but not for zerofill sections). - Fixed a bug in output_cstrings() when freeing up the data the loop was using a pointer to a free()'ed item. - Changed the checks in check_symbol() to allow stabs to have any of the N_TYPE bits on and treated like N_SECT (their n_sect feild checked). - Added 4 byte and 8 byte literals. - Added a test in allocate() so that if a size of zero is asked for then NULL is returned and malloc is not called. This allows malloc() to return NULL if a zero size is requested and not to be flagged as an error. - Added a comma between the perror string and the printing of errno = x in the error routines. Changes for the Warp 3 (OS update) release (the -25 compiler release): - Added rld_load_from_memory() and fixed a vm_allocate leak for the input object file when an error ocurred. - Added scattered relocation entries to generic_reloc() in generic_reloc.c. See the comments in . This allows scattered loading to work relibly. - Fixed bug 6264 which produced a error with an archive that had zero ranlib structures in it. It now prints a warning. - Fixed bug 6261 which printed the linkedit segment has zero size when using -s and the no seglinkedit flag was specified. It is no longer printed in this case but is printed when the -seglinkedit flag is specified. Changes for the Warp 3 release (the -24 compiler release): - Fixed a bug in lookup_fvmlib() which did not bzero the memory it allocated for a merged_fvmlib structure causing a bogus next pointer in that struct. - Fixed a bug in rld_load_basefile() that is not set the host_pagesize which caused enter_string to allocate each string in it's own string block. - Fixed a bug where the __end symbols did not get the correct value because their section number was set to the last section in their segment and not their first as they should have been. - Removed all compiler "might be" warning messages for -DDEBUG and -DRLD. - Implemented scattered loading vi -sectorder (and added the -sectorder_detail option along with this). This has NOT been put on the man page because of the relocation limititations it can't detect. - Removed "mach_missing.h" (mach_error_string from and map_fd from libc.h (brain damaged but there)). - Added one argument (headers_size) to the function passed to rld_address_func. - Moved rld.h to ../include and it will be installed in /usr/include. - Added a -w flag to suppress warnings. - Added saving away errno in the system_{error,fatal} routines before doing any thing that could cause a system call (like a print). This is in hope to get rid of the wrong error string (Inapropate ioctl for device) when it can't open a file (the value of errno is also printed). Changes for the Warp 1 release (the -23 compiler release): - Added the -headerpad option to pad the header for MH_EXECUTE files. The header is allways padded for MH_EXECUTE by the greater of this or the round off due to the segment rounding. - Fixed a bug in clean_archives() when an rld_load_basefile() was called there are no sets so the the loop in clean_archives() was wrapped with an if(sets != NULL) . - Fixed a bug that merge_literal_sections() merged the sections contents from the base file. - Now is linked with libsys. - Made created seglinkedit by default for object formats that can have it and set the default init protect to r-x. Also added the -noseglinkedit option to turn this off. - Added a message to the rld() calls when they return failure because of previous fatal errors (otherwise they print nothing and it fails). Changes for the 2.0 impulse X.X release (the -22 compiler release): - Added the ablity to link from archives with rld_load(). - Fixed a memory leak in the rld package when an rld_load() failed before pass2() and it was never called then the undefined_maps for that object set were not free()'ed. Remove object now also frees these maps if they are not already free. Changes for the 2.0 impulse X.X release (the -21 compiler release): - Changed the default format if -A is specified and no filetype is specified, it now is MH_OBJECT. - Added the following functions to the rld package: rld_unload_all, rld_load_basefile, rld_address_func and added another argument to rld_load which is the output name of the debugging file for gdb. - Fixed -X to not strip stab symbols that start with 'L'. - Added the -b flag to strip the base symbols from the output file when doing an ld -A. This results in a much smaller output file which should still be useful for gdb(1)'s addfile command. - Added coded in pass1() and rld_load() to handle the bug in the kernel that will not allow map_fd() to map a file with zero length. Changes for the 2.0 impulse X.X release (the -20 compiler release): - Added the -sectobjectsymbols option to produce the file.o symbols. - Fixed some nits in pass1() in some error cases printing the member name with out trimming the trailing blanks. - Fixed two bugs in generic_reloc() in the error case when an external relocation entry's r_symbolnum is not found in the undefined_map and then the wrong index (i) was used instead of (symbolnum) to index the symbol table and determine the error in the object file. Changes for the 2.0 impulse X.X release (the -19 compiler release): - Fixed a bug in the rld package to correctly unload common symbols allocated in a set of objects loaded. - Fixed a bug in the rld package to not enter undefined, common and indirect symbols from the base program (this causes the hash table to be in an incorrect state if a dymnamicly loaded object defines one of these symbols and it is unloaded). - Added a check to make sure the string table ends with a '\0'. - ld is no longer installed as ld- to match the rest of the project. - Changed so that no longer allow two absolute symbols with the same value to not cause a multiply defined symbol. - Updated for the changes to CPU_TYPE and CPU_SUBTYPE with the changes to - Fixed a bug in layout() that didn't get the addresses of sections right (and then possibly the filesizes of segments right). This was cause by setting the section address to the rounded