aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ld/ChangeLog9
-rw-r--r--ld/ld.texinfo16
-rw-r--r--ld/ldmain.c6
-rw-r--r--ld/lexsup.c14
4 files changed, 44 insertions, 1 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog
index 0c2bf7b..f6962ca 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,12 @@
+1999-06-22 Mark Mitchell <mark@codesourcery.com>
+
+ * ldmain.c (main): Initialize link_info.init_function and
+ link_info.fini_function.
+ * lexsup.c (OPTION_INIT): New macro.
+ (OPTION_FINI): Likewise.
+ (ld_options): Add descriptions for them.
+ (parse_args): Handle them.
+
1999-06-23 Ian Lance Taylor <ian@zembu.com>
* ldlang.c (section_already_linked): Only discard link once
diff --git a/ld/ld.texinfo b/ld/ld.texinfo
index 73dc816..115f7a2 100644
--- a/ld/ld.texinfo
+++ b/ld/ld.texinfo
@@ -404,6 +404,14 @@ purpose: the @code{-b}, @code{--format}, @code{--oformat} options, the
environment variable. The @sc{gnu} linker will ignore the @code{-F}
option when not creating an ELF shared object.
+@cindex finalization function
+@kindex -fini
+@item -fini @var{name}
+When creating an ELF executable or shared object, call NAME when the
+executable or shared object is unloaded, by setting DT_FINI to the
+address of the function. By default, the linker uses @code{_fini} as
+the function to call.
+
@kindex -g
@item -g
Ignored. Provided for compatibility with other tools.
@@ -434,6 +442,14 @@ field rather than the using the file name given to the linker.
@item -i
Perform an incremental link (same as option @samp{-r}).
+@cindex initialization function
+@kindex -init
+@item -init @var{name}
+When creating an ELF executable or shared object, call NAME when the
+executable or shared object is loaded, by setting DT_INIT to the address
+of the function. By default, the linker uses @code{_init} as the
+function to call.
+
@cindex archive files, from cmd line
@kindex -l@var{archive}
@kindex --library=@var{archive}
diff --git a/ld/ldmain.c b/ld/ldmain.c
index 1e710db..7eef3e5 100644
--- a/ld/ldmain.c
+++ b/ld/ldmain.c
@@ -231,7 +231,11 @@ main (argc, argv)
link_info.notice_hash = NULL;
link_info.wrap_hash = NULL;
link_info.mpc860c0 = 0;
-
+ /* SVR4 linkers seem to set DT_INIT and DT_FINI based on magic _init
+ and _fini symbols. We are compatible. */
+ link_info.init_function = "_init";
+ link_info.fini_function = "_fini";
+
ldfile_add_arch ("");
config.make_executable = true;
diff --git a/ld/lexsup.c b/ld/lexsup.c
index a990693..8f4785b 100644
--- a/ld/lexsup.c
+++ b/ld/lexsup.c
@@ -120,6 +120,8 @@ int parsing_defsym = 0;
#define OPTION_NO_CHECK_SECTIONS (OPTION_CHECK_SECTIONS + 1)
#define OPTION_MPC860C0 (OPTION_NO_CHECK_SECTIONS + 1)
#define OPTION_NO_UNDEFINED (OPTION_MPC860C0 + 1)
+#define OPTION_INIT (OPTION_NO_UNDEFINED + 1)
+#define OPTION_FINI (OPTION_INIT + 1)
/* The long options. This structure is used for both the option
parsing and the help text. */
@@ -270,6 +272,8 @@ static const struct ld_option ld_options[] =
'\0', N_("PROGRAM"), N_("Set the dynamic linker to use"), TWO_DASHES },
{ {"embedded-relocs", no_argument, NULL, OPTION_EMBEDDED_RELOCS},
'\0', NULL, N_("Generate embedded relocs"), TWO_DASHES},
+ { {"fini", required_argument, NULL, OPTION_FINI},
+ '\0', N_("SYMBOL"), N_("Call SYMBOL at unload-time"), ONE_DASH },
{ {"force-exe-suffix", no_argument, NULL, OPTION_FORCE_EXE_SUFFIX},
'\0', NULL, N_("Force generation of file with .exe suffix"), TWO_DASHES},
{ {"gc-sections", no_argument, NULL, OPTION_GC_SECTIONS},
@@ -280,6 +284,8 @@ static const struct ld_option ld_options[] =
TWO_DASHES },
{ {"help", no_argument, NULL, OPTION_HELP},
'\0', NULL, N_("Print option help"), TWO_DASHES },
+ { {"init", required_argument, NULL, OPTION_INIT},
+ '\0', N_("SYMBOL"), N_("Call SYMBOL at load-time"), ONE_DASH },
{ {"Map", required_argument, NULL, OPTION_MAP},
'\0', N_("FILE"), N_("Write a map file"), ONE_DASH },
{ {"no-demangle", no_argument, NULL, OPTION_NO_DEMANGLE },
@@ -988,6 +994,14 @@ the GNU General Public License. This program has absolutely no warranty.\n"));
}
command_line.relax = true;
break;
+
+ case OPTION_INIT:
+ link_info.init_function = optarg;
+ break;
+
+ case OPTION_FINI:
+ link_info.fini_function = optarg;
+ break;
}
}