| 1 | /* This file is is generated by a shell script. DO NOT EDIT! */
|
|---|
| 2 |
|
|---|
| 3 | /* 32 bit ELF emulation code for elf32ebmip
|
|---|
| 4 | Copyright 1991, 1993, 1994, 1995, 1996, 1997, 1999, 2000, 2001
|
|---|
| 5 | Free Software Foundation, Inc.
|
|---|
| 6 | Written by Steve Chamberlain <sac@cygnus.com>
|
|---|
| 7 | ELF support by Ian Lance Taylor <ian@cygnus.com>
|
|---|
| 8 |
|
|---|
| 9 | This file is part of GLD, the Gnu Linker.
|
|---|
| 10 |
|
|---|
| 11 | This program is free software; you can redistribute it and/or modify
|
|---|
| 12 | it under the terms of the GNU General Public License as published by
|
|---|
| 13 | the Free Software Foundation; either version 2 of the License, or
|
|---|
| 14 | (at your option) any later version.
|
|---|
| 15 |
|
|---|
| 16 | This program is distributed in the hope that it will be useful,
|
|---|
| 17 | but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|---|
| 18 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|---|
| 19 | GNU General Public License for more details.
|
|---|
| 20 |
|
|---|
| 21 | You should have received a copy of the GNU General Public License
|
|---|
| 22 | along with this program; if not, write to the Free Software
|
|---|
| 23 | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
|---|
| 24 |
|
|---|
| 25 | #define TARGET_IS_elf32ebmip
|
|---|
| 26 |
|
|---|
| 27 | #include "bfd.h"
|
|---|
| 28 | #include "sysdep.h"
|
|---|
| 29 |
|
|---|
| 30 | #include <ctype.h>
|
|---|
| 31 |
|
|---|
| 32 | #include "bfdlink.h"
|
|---|
| 33 |
|
|---|
| 34 | #include "ld.h"
|
|---|
| 35 | #include "ldmain.h"
|
|---|
| 36 | #include "ldmisc.h"
|
|---|
| 37 | #include "ldexp.h"
|
|---|
| 38 | #include "ldlang.h"
|
|---|
| 39 | #include "ldgram.h"
|
|---|
| 40 | #include "ldfile.h"
|
|---|
| 41 | #include "ldemul.h"
|
|---|
| 42 |
|
|---|
| 43 | static void gldelf32ebmip_before_parse PARAMS ((void));
|
|---|
| 44 | static boolean gldelf32ebmip_open_dynamic_archive
|
|---|
| 45 | PARAMS ((const char *, search_dirs_type *, lang_input_statement_type *));
|
|---|
| 46 | static void gldelf32ebmip_after_open PARAMS ((void));
|
|---|
| 47 | static void gldelf32ebmip_check_needed
|
|---|
| 48 | PARAMS ((lang_input_statement_type *));
|
|---|
| 49 | static void gldelf32ebmip_stat_needed
|
|---|
| 50 | PARAMS ((lang_input_statement_type *));
|
|---|
| 51 | static boolean gldelf32ebmip_search_needed
|
|---|
| 52 | PARAMS ((const char *, const char *));
|
|---|
| 53 | static boolean gldelf32ebmip_try_needed PARAMS ((const char *));
|
|---|
| 54 | static void gldelf32ebmip_before_allocation PARAMS ((void));
|
|---|
| 55 | static void gldelf32ebmip_find_statement_assignment
|
|---|
| 56 | PARAMS ((lang_statement_union_type *));
|
|---|
| 57 | static void gldelf32ebmip_find_exp_assignment PARAMS ((etree_type *));
|
|---|
| 58 | static boolean gldelf32ebmip_place_orphan
|
|---|
| 59 | PARAMS ((lang_input_statement_type *, asection *));
|
|---|
| 60 | static void gldelf32ebmip_place_section
|
|---|
| 61 | PARAMS ((lang_statement_union_type *));
|
|---|
| 62 | static char *gldelf32ebmip_get_script PARAMS ((int *isfile));
|
|---|
| 63 |
|
|---|
| 64 | static void
|
|---|
| 65 | gldelf32ebmip_before_parse()
|
|---|
| 66 | {
|
|---|
| 67 | ldfile_output_architecture = bfd_arch_mips;
|
|---|
| 68 | config.dynamic_link = true;
|
|---|
| 69 | }
|
|---|
| 70 |
|
|---|
| 71 | /* Try to open a dynamic archive. This is where we know that ELF
|
|---|
| 72 | dynamic libraries have an extension of .so. */
|
|---|
| 73 |
|
|---|
| 74 | static boolean
|
|---|
| 75 | gldelf32ebmip_open_dynamic_archive (arch, search, entry)
|
|---|
| 76 | const char *arch;
|
|---|
| 77 | search_dirs_type *search;
|
|---|
| 78 | lang_input_statement_type *entry;
|
|---|
| 79 | {
|
|---|
| 80 | const char *filename;
|
|---|
| 81 | char *string;
|
|---|
| 82 |
|
|---|
| 83 | if (! entry->is_archive)
|
|---|
| 84 | return false;
|
|---|
| 85 |
|
|---|
| 86 | filename = entry->filename;
|
|---|
| 87 |
|
|---|
| 88 | string = (char *) xmalloc (strlen (search->name)
|
|---|
| 89 | + strlen (filename)
|
|---|
| 90 | + strlen (arch)
|
|---|
| 91 | + sizeof "/lib.so");
|
|---|
| 92 |
|
|---|
| 93 | sprintf (string, "%s/lib%s%s.so", search->name, filename, arch);
|
|---|
| 94 |
|
|---|
| 95 | if (! ldfile_try_open_bfd (string, entry))
|
|---|
| 96 | {
|
|---|
| 97 | free (string);
|
|---|
| 98 | return false;
|
|---|
| 99 | }
|
|---|
| 100 |
|
|---|
| 101 | entry->filename = string;
|
|---|
| 102 |
|
|---|
| 103 | /* We have found a dynamic object to include in the link. The ELF
|
|---|
| 104 | backend linker will create a DT_NEEDED entry in the .dynamic
|
|---|
| 105 | section naming this file. If this file includes a DT_SONAME
|
|---|
| 106 | entry, it will be used. Otherwise, the ELF linker will just use
|
|---|
| 107 | the name of the file. For an archive found by searching, like
|
|---|
| 108 | this one, the DT_NEEDED entry should consist of just the name of
|
|---|
| 109 | the file, without the path information used to find it. Note
|
|---|
| 110 | that we only need to do this if we have a dynamic object; an
|
|---|
| 111 | archive will never be referenced by a DT_NEEDED entry.
|
|---|
| 112 |
|
|---|
| 113 | FIXME: This approach--using bfd_elf_set_dt_needed_name--is not
|
|---|
| 114 | very pretty. I haven't been able to think of anything that is
|
|---|
| 115 | pretty, though. */
|
|---|
| 116 | if (bfd_check_format (entry->the_bfd, bfd_object)
|
|---|
| 117 | && (entry->the_bfd->flags & DYNAMIC) != 0)
|
|---|
| 118 | {
|
|---|
| 119 | char *needed_name;
|
|---|
| 120 |
|
|---|
| 121 | ASSERT (entry->is_archive && entry->search_dirs_flag);
|
|---|
| 122 | needed_name = (char *) xmalloc (strlen (filename)
|
|---|
| 123 | + strlen (arch)
|
|---|
| 124 | + sizeof "lib.so");
|
|---|
| 125 | sprintf (needed_name, "lib%s%s.so", filename, arch);
|
|---|
| 126 | bfd_elf_set_dt_needed_name (entry->the_bfd, needed_name);
|
|---|
| 127 | }
|
|---|
| 128 |
|
|---|
| 129 | return true;
|
|---|
| 130 | }
|
|---|
| 131 |
|
|---|
| 132 |
|
|---|
| 133 | /* These variables are required to pass information back and forth
|
|---|
| 134 | between after_open and check_needed and stat_needed. */
|
|---|
| 135 |
|
|---|
| 136 | static struct bfd_link_needed_list *global_needed;
|
|---|
| 137 | static struct stat global_stat;
|
|---|
| 138 | static boolean global_found;
|
|---|
| 139 |
|
|---|
| 140 | /* This is called after all the input files have been opened. */
|
|---|
| 141 |
|
|---|
| 142 | static void
|
|---|
| 143 | gldelf32ebmip_after_open ()
|
|---|
| 144 | {
|
|---|
| 145 | struct bfd_link_needed_list *needed, *l;
|
|---|
| 146 |
|
|---|
| 147 | /* We only need to worry about this when doing a final link. */
|
|---|
| 148 | if (link_info.relocateable || link_info.shared)
|
|---|
| 149 | return;
|
|---|
| 150 |
|
|---|
| 151 | /* Get the list of files which appear in DT_NEEDED entries in
|
|---|
| 152 | dynamic objects included in the link (often there will be none).
|
|---|
| 153 | For each such file, we want to track down the corresponding
|
|---|
| 154 | library, and include the symbol table in the link. This is what
|
|---|
| 155 | the runtime dynamic linker will do. Tracking the files down here
|
|---|
| 156 | permits one dynamic object to include another without requiring
|
|---|
| 157 | special action by the person doing the link. Note that the
|
|---|
| 158 | needed list can actually grow while we are stepping through this
|
|---|
| 159 | loop. */
|
|---|
| 160 | needed = bfd_elf_get_needed_list (output_bfd, &link_info);
|
|---|
| 161 | for (l = needed; l != NULL; l = l->next)
|
|---|
| 162 | {
|
|---|
| 163 | struct bfd_link_needed_list *ll;
|
|---|
| 164 | const char *lib_path;
|
|---|
| 165 | size_t len;
|
|---|
| 166 | search_dirs_type *search;
|
|---|
| 167 |
|
|---|
| 168 | /* If we've already seen this file, skip it. */
|
|---|
| 169 | for (ll = needed; ll != l; ll = ll->next)
|
|---|
| 170 | if (strcmp (ll->name, l->name) == 0)
|
|---|
| 171 | break;
|
|---|
| 172 | if (ll != l)
|
|---|
| 173 | continue;
|
|---|
| 174 |
|
|---|
| 175 | /* See if this file was included in the link explicitly. */
|
|---|
| 176 | global_needed = l;
|
|---|
| 177 | global_found = false;
|
|---|
| 178 | lang_for_each_input_file (gldelf32ebmip_check_needed);
|
|---|
| 179 | if (global_found)
|
|---|
| 180 | continue;
|
|---|
| 181 |
|
|---|
| 182 | /* We need to find this file and include the symbol table. We
|
|---|
| 183 | want to search for the file in the same way that the dynamic
|
|---|
| 184 | linker will search. That means that we want to use
|
|---|
| 185 | rpath_link, rpath, then the environment variable
|
|---|
| 186 | LD_LIBRARY_PATH (native only), then the linker script
|
|---|
| 187 | LIB_SEARCH_DIRS. We do not search using the -L arguments. */
|
|---|
| 188 | if (gldelf32ebmip_search_needed (command_line.rpath_link,
|
|---|
| 189 | l->name))
|
|---|
| 190 | continue;
|
|---|
| 191 | if (gldelf32ebmip_search_needed (command_line.rpath, l->name))
|
|---|
| 192 | continue;
|
|---|
| 193 | if (command_line.rpath_link == NULL
|
|---|
| 194 | && command_line.rpath == NULL)
|
|---|
| 195 | {
|
|---|
| 196 | lib_path = (const char *) getenv ("LD_RUN_PATH");
|
|---|
| 197 | if (gldelf32ebmip_search_needed (lib_path, l->name))
|
|---|
| 198 | continue;
|
|---|
| 199 | }
|
|---|
| 200 | len = strlen (l->name);
|
|---|
| 201 | for (search = search_head; search != NULL; search = search->next)
|
|---|
| 202 | {
|
|---|
| 203 | char *filename;
|
|---|
| 204 |
|
|---|
| 205 | if (search->cmdline)
|
|---|
| 206 | continue;
|
|---|
| 207 | filename = (char *) xmalloc (strlen (search->name) + len + 2);
|
|---|
| 208 | sprintf (filename, "%s/%s", search->name, l->name);
|
|---|
| 209 | if (gldelf32ebmip_try_needed (filename))
|
|---|
| 210 | break;
|
|---|
| 211 | free (filename);
|
|---|
| 212 | }
|
|---|
| 213 | if (search != NULL)
|
|---|
| 214 | continue;
|
|---|
| 215 |
|
|---|
| 216 | einfo (_("%P: warning: %s, needed by %B, not found\n"),
|
|---|
| 217 | l->name, l->by);
|
|---|
| 218 | }
|
|---|
| 219 | }
|
|---|
| 220 |
|
|---|
| 221 | /* Search for a needed file in a path. */
|
|---|
| 222 |
|
|---|
| 223 | static boolean
|
|---|
| 224 | gldelf32ebmip_search_needed (path, name)
|
|---|
| 225 | const char *path;
|
|---|
| 226 | const char *name;
|
|---|
| 227 | {
|
|---|
| 228 | const char *s;
|
|---|
| 229 | size_t len;
|
|---|
| 230 |
|
|---|
| 231 | if (path == NULL || *path == '\0')
|
|---|
| 232 | return false;
|
|---|
| 233 | len = strlen (name);
|
|---|
| 234 | while (1)
|
|---|
| 235 | {
|
|---|
| 236 | char *filename, *sset;
|
|---|
| 237 |
|
|---|
| 238 | s = strchr (path, ':');
|
|---|
| 239 | if (s == NULL)
|
|---|
| 240 | s = path + strlen (path);
|
|---|
| 241 |
|
|---|
| 242 | filename = (char *) xmalloc (s - path + len + 2);
|
|---|
| 243 | if (s == path)
|
|---|
| 244 | sset = filename;
|
|---|
| 245 | else
|
|---|
| 246 | {
|
|---|
| 247 | memcpy (filename, path, s - path);
|
|---|
| 248 | filename[s - path] = '/';
|
|---|
| 249 | sset = filename + (s - path) + 1;
|
|---|
| 250 | }
|
|---|
| 251 | strcpy (sset, name);
|
|---|
| 252 |
|
|---|
| 253 | if (gldelf32ebmip_try_needed (filename))
|
|---|
| 254 | return true;
|
|---|
| 255 |
|
|---|
| 256 | free (filename);
|
|---|
| 257 |
|
|---|
| 258 | if (*s == '\0')
|
|---|
| 259 | break;
|
|---|
| 260 | path = s + 1;
|
|---|
| 261 | }
|
|---|
| 262 |
|
|---|
| 263 | return false;
|
|---|
| 264 | }
|
|---|
| 265 |
|
|---|
| 266 | /* This function is called for each possible name for a dynamic object
|
|---|
| 267 | named by a DT_NEEDED entry. */
|
|---|
| 268 |
|
|---|
| 269 | static boolean
|
|---|
| 270 | gldelf32ebmip_try_needed (name)
|
|---|
| 271 | const char *name;
|
|---|
| 272 | {
|
|---|
| 273 | bfd *abfd;
|
|---|
| 274 |
|
|---|
| 275 | abfd = bfd_openr (name, bfd_get_target (output_bfd));
|
|---|
| 276 | if (abfd == NULL)
|
|---|
| 277 | return false;
|
|---|
| 278 | if (! bfd_check_format (abfd, bfd_object))
|
|---|
| 279 | {
|
|---|
| 280 | (void) bfd_close (abfd);
|
|---|
| 281 | return false;
|
|---|
| 282 | }
|
|---|
| 283 | if ((bfd_get_file_flags (abfd) & DYNAMIC) == 0)
|
|---|
| 284 | {
|
|---|
| 285 | (void) bfd_close (abfd);
|
|---|
| 286 | return false;
|
|---|
| 287 | }
|
|---|
| 288 |
|
|---|
| 289 | /* We've found a dynamic object matching the DT_NEEDED entry. */
|
|---|
| 290 |
|
|---|
| 291 | /* We have already checked that there is no other input file of the
|
|---|
| 292 | same name. We must now check again that we are not including the
|
|---|
| 293 | same file twice. We need to do this because on many systems
|
|---|
| 294 | libc.so is a symlink to, e.g., libc.so.1. The SONAME entry will
|
|---|
| 295 | reference libc.so.1. If we have already included libc.so, we
|
|---|
| 296 | don't want to include libc.so.1 if they are the same file, and we
|
|---|
| 297 | can only check that using stat. */
|
|---|
| 298 |
|
|---|
| 299 | if (bfd_stat (abfd, &global_stat) != 0)
|
|---|
| 300 | einfo (_("%F%P:%B: bfd_stat failed: %E\n"), abfd);
|
|---|
| 301 | global_found = false;
|
|---|
| 302 | lang_for_each_input_file (gldelf32ebmip_stat_needed);
|
|---|
| 303 | if (global_found)
|
|---|
| 304 | {
|
|---|
| 305 | /* Return true to indicate that we found the file, even though
|
|---|
| 306 | we aren't going to do anything with it. */
|
|---|
| 307 | return true;
|
|---|
| 308 | }
|
|---|
| 309 |
|
|---|
| 310 | /* Tell the ELF backend that don't want the output file to have a
|
|---|
| 311 | DT_NEEDED entry for this file. */
|
|---|
| 312 | bfd_elf_set_dt_needed_name (abfd, "");
|
|---|
| 313 |
|
|---|
| 314 | /* Add this file into the symbol table. */
|
|---|
| 315 | if (! bfd_link_add_symbols (abfd, &link_info))
|
|---|
| 316 | einfo (_("%F%B: could not read symbols: %E\n"), abfd);
|
|---|
| 317 |
|
|---|
| 318 | return true;
|
|---|
| 319 | }
|
|---|
| 320 |
|
|---|
| 321 | /* See if an input file matches a DT_NEEDED entry by name. */
|
|---|
| 322 |
|
|---|
| 323 | static void
|
|---|
| 324 | gldelf32ebmip_check_needed (s)
|
|---|
| 325 | lang_input_statement_type *s;
|
|---|
| 326 | {
|
|---|
| 327 | if (global_found)
|
|---|
| 328 | return;
|
|---|
| 329 |
|
|---|
| 330 | if (s->filename != NULL
|
|---|
| 331 | && strcmp (s->filename, global_needed->name) == 0)
|
|---|
| 332 | {
|
|---|
| 333 | global_found = true;
|
|---|
| 334 | return;
|
|---|
| 335 | }
|
|---|
| 336 |
|
|---|
| 337 | if (s->the_bfd != NULL)
|
|---|
| 338 | {
|
|---|
| 339 | const char *soname;
|
|---|
| 340 |
|
|---|
| 341 | soname = bfd_elf_get_dt_soname (s->the_bfd);
|
|---|
| 342 | if (soname != NULL
|
|---|
| 343 | && strcmp (soname, global_needed->name) == 0)
|
|---|
| 344 | {
|
|---|
| 345 | global_found = true;
|
|---|
| 346 | return;
|
|---|
| 347 | }
|
|---|
| 348 | }
|
|---|
| 349 |
|
|---|
| 350 | if (s->search_dirs_flag
|
|---|
| 351 | && s->filename != NULL
|
|---|
| 352 | && strchr (global_needed->name, '/') == NULL)
|
|---|
| 353 | {
|
|---|
| 354 | const char *f;
|
|---|
| 355 |
|
|---|
| 356 | f = strrchr (s->filename, '/');
|
|---|
| 357 | if (f != NULL
|
|---|
| 358 | && strcmp (f + 1, global_needed->name) == 0)
|
|---|
| 359 | {
|
|---|
| 360 | global_found = true;
|
|---|
| 361 | return;
|
|---|
| 362 | }
|
|---|
| 363 | }
|
|---|
| 364 | }
|
|---|
| 365 |
|
|---|
| 366 | /* See if an input file matches a DT_NEEDED entry by running stat on
|
|---|
| 367 | the file. */
|
|---|
| 368 |
|
|---|
| 369 | static void
|
|---|
| 370 | gldelf32ebmip_stat_needed (s)
|
|---|
| 371 | lang_input_statement_type *s;
|
|---|
| 372 | {
|
|---|
| 373 | struct stat st;
|
|---|
| 374 | const char *suffix;
|
|---|
| 375 | const char *soname;
|
|---|
| 376 | const char *f;
|
|---|
| 377 |
|
|---|
| 378 | if (global_found)
|
|---|
| 379 | return;
|
|---|
| 380 | if (s->the_bfd == NULL)
|
|---|
| 381 | return;
|
|---|
| 382 |
|
|---|
| 383 | if (bfd_stat (s->the_bfd, &st) != 0)
|
|---|
| 384 | {
|
|---|
| 385 | einfo (_("%P:%B: bfd_stat failed: %E\n"), s->the_bfd);
|
|---|
| 386 | return;
|
|---|
| 387 | }
|
|---|
| 388 |
|
|---|
| 389 | if (st.st_dev == global_stat.st_dev
|
|---|
| 390 | && st.st_ino == global_stat.st_ino)
|
|---|
| 391 | {
|
|---|
| 392 | global_found = true;
|
|---|
| 393 | return;
|
|---|
| 394 | }
|
|---|
| 395 |
|
|---|
| 396 | /* We issue a warning if it looks like we are including two
|
|---|
| 397 | different versions of the same shared library. For example,
|
|---|
| 398 | there may be a problem if -lc picks up libc.so.6 but some other
|
|---|
| 399 | shared library has a DT_NEEDED entry of libc.so.5. This is a
|
|---|
| 400 | hueristic test, and it will only work if the name looks like
|
|---|
| 401 | NAME.so.VERSION. FIXME: Depending on file names is error-prone.
|
|---|
| 402 | If we really want to issue warnings about mixing version numbers
|
|---|
| 403 | of shared libraries, we need to find a better way. */
|
|---|
| 404 |
|
|---|
| 405 | if (strchr (global_needed->name, '/') != NULL)
|
|---|
| 406 | return;
|
|---|
| 407 | suffix = strstr (global_needed->name, ".so.");
|
|---|
| 408 | if (suffix == NULL)
|
|---|
| 409 | return;
|
|---|
| 410 | suffix += sizeof ".so." - 1;
|
|---|
| 411 |
|
|---|
| 412 | soname = bfd_elf_get_dt_soname (s->the_bfd);
|
|---|
| 413 | if (soname == NULL)
|
|---|
| 414 | soname = s->filename;
|
|---|
| 415 |
|
|---|
| 416 | f = strrchr (soname, '/');
|
|---|
| 417 | if (f != NULL)
|
|---|
| 418 | ++f;
|
|---|
| 419 | else
|
|---|
| 420 | f = soname;
|
|---|
| 421 |
|
|---|
| 422 | if (strncmp (f, global_needed->name, suffix - global_needed->name) == 0)
|
|---|
| 423 | einfo (_("%P: warning: %s, needed by %B, may conflict with %s\n"),
|
|---|
| 424 | global_needed->name, global_needed->by, f);
|
|---|
| 425 | }
|
|---|
| 426 |
|
|---|
| 427 | /* This is called after the sections have been attached to output
|
|---|
| 428 | sections, but before any sizes or addresses have been set. */
|
|---|
| 429 |
|
|---|
| 430 | static void
|
|---|
| 431 | gldelf32ebmip_before_allocation ()
|
|---|
| 432 | {
|
|---|
| 433 | const char *rpath;
|
|---|
| 434 | asection *sinterp;
|
|---|
| 435 |
|
|---|
| 436 | /* If we are going to make any variable assignments, we need to let
|
|---|
| 437 | the ELF backend know about them in case the variables are
|
|---|
| 438 | referred to by dynamic objects. */
|
|---|
| 439 | lang_for_each_statement (gldelf32ebmip_find_statement_assignment);
|
|---|
| 440 |
|
|---|
| 441 | /* Let the ELF backend work out the sizes of any sections required
|
|---|
| 442 | by dynamic linking. */
|
|---|
| 443 | rpath = command_line.rpath;
|
|---|
| 444 | if (rpath == NULL)
|
|---|
| 445 | rpath = (const char *) getenv ("LD_RUN_PATH");
|
|---|
| 446 | if (! (bfd_elf32_size_dynamic_sections
|
|---|
| 447 | (output_bfd, command_line.soname, rpath,
|
|---|
| 448 | command_line.export_dynamic, command_line.filter_shlib,
|
|---|
| 449 | (const char * const *) command_line.auxiliary_filters,
|
|---|
| 450 | &link_info, &sinterp, lang_elf_version_info)))
|
|---|
| 451 | einfo (_("%P%F: failed to set dynamic section sizes: %E\n"));
|
|---|
| 452 |
|
|---|
| 453 | /* Let the user override the dynamic linker we are using. */
|
|---|
| 454 | if (command_line.interpreter != NULL
|
|---|
| 455 | && sinterp != NULL)
|
|---|
| 456 | {
|
|---|
| 457 | sinterp->contents = (bfd_byte *) command_line.interpreter;
|
|---|
| 458 | sinterp->_raw_size = strlen (command_line.interpreter) + 1;
|
|---|
| 459 | }
|
|---|
| 460 |
|
|---|
| 461 | /* Look for any sections named .gnu.warning. As a GNU extensions,
|
|---|
| 462 | we treat such sections as containing warning messages. We print
|
|---|
| 463 | out the warning message, and then zero out the section size so
|
|---|
| 464 | that it does not get copied into the output file. */
|
|---|
| 465 |
|
|---|
| 466 | {
|
|---|
| 467 | LANG_FOR_EACH_INPUT_STATEMENT (is)
|
|---|
| 468 | {
|
|---|
| 469 | asection *s;
|
|---|
| 470 | bfd_size_type sz;
|
|---|
| 471 | char *msg;
|
|---|
| 472 | boolean ret;
|
|---|
| 473 |
|
|---|
| 474 | if (is->just_syms_flag)
|
|---|
| 475 | continue;
|
|---|
| 476 |
|
|---|
| 477 | s = bfd_get_section_by_name (is->the_bfd, ".gnu.warning");
|
|---|
| 478 | if (s == NULL)
|
|---|
| 479 | continue;
|
|---|
| 480 |
|
|---|
| 481 | sz = bfd_section_size (is->the_bfd, s);
|
|---|
| 482 | msg = xmalloc ((size_t) sz + 1);
|
|---|
| 483 | if (! bfd_get_section_contents (is->the_bfd, s, msg, (file_ptr) 0, sz))
|
|---|
| 484 | einfo (_("%F%B: Can't read contents of section .gnu.warning: %E\n"),
|
|---|
| 485 | is->the_bfd);
|
|---|
| 486 | msg[sz] = '\0';
|
|---|
| 487 | ret = link_info.callbacks->warning (&link_info, msg,
|
|---|
| 488 | (const char *) NULL,
|
|---|
| 489 | is->the_bfd, (asection *) NULL,
|
|---|
| 490 | (bfd_vma) 0);
|
|---|
| 491 | ASSERT (ret);
|
|---|
| 492 | free (msg);
|
|---|
| 493 |
|
|---|
| 494 | /* Clobber the section size, so that we don't waste copying the
|
|---|
| 495 | warning into the output file. */
|
|---|
| 496 | s->_raw_size = 0;
|
|---|
| 497 | }
|
|---|
| 498 | }
|
|---|
| 499 | }
|
|---|
| 500 |
|
|---|
| 501 | /* This is called by the before_allocation routine via
|
|---|
| 502 | lang_for_each_statement. It locates any assignment statements, and
|
|---|
| 503 | tells the ELF backend about them, in case they are assignments to
|
|---|
| 504 | symbols which are referred to by dynamic objects. */
|
|---|
| 505 |
|
|---|
| 506 | static void
|
|---|
| 507 | gldelf32ebmip_find_statement_assignment (s)
|
|---|
| 508 | lang_statement_union_type *s;
|
|---|
| 509 | {
|
|---|
| 510 | if (s->header.type == lang_assignment_statement_enum)
|
|---|
| 511 | gldelf32ebmip_find_exp_assignment (s->assignment_statement.exp);
|
|---|
| 512 | }
|
|---|
| 513 |
|
|---|
| 514 | /* Look through an expression for an assignment statement. */
|
|---|
| 515 |
|
|---|
| 516 | static void
|
|---|
| 517 | gldelf32ebmip_find_exp_assignment (exp)
|
|---|
| 518 | etree_type *exp;
|
|---|
| 519 | {
|
|---|
| 520 | struct bfd_link_hash_entry *h;
|
|---|
| 521 |
|
|---|
| 522 | switch (exp->type.node_class)
|
|---|
| 523 | {
|
|---|
| 524 | case etree_provide:
|
|---|
| 525 | case etree_provided:
|
|---|
| 526 | h = bfd_link_hash_lookup (link_info.hash, exp->assign.dst,
|
|---|
| 527 | false, false, false);
|
|---|
| 528 | if (h == NULL)
|
|---|
| 529 | break;
|
|---|
| 530 |
|
|---|
| 531 | /* We call record_link_assignment even if the symbol is defined.
|
|---|
| 532 | This is because if it is defined by a dynamic object, we
|
|---|
| 533 | actually want to use the value defined by the linker script,
|
|---|
| 534 | not the value from the dynamic object (because we are setting
|
|---|
| 535 | symbols like etext). If the symbol is defined by a regular
|
|---|
| 536 | object, then, as it happens, calling record_link_assignment
|
|---|
| 537 | will do no harm. */
|
|---|
| 538 |
|
|---|
| 539 | /* Fall through. */
|
|---|
| 540 | case etree_assign:
|
|---|
| 541 | if (strcmp (exp->assign.dst, ".") != 0)
|
|---|
| 542 | {
|
|---|
| 543 | if (! (bfd_elf32_record_link_assignment
|
|---|
| 544 | (output_bfd, &link_info, exp->assign.dst,
|
|---|
| 545 | exp->type.node_class != etree_assign ? true : false)))
|
|---|
| 546 | einfo (_("%P%F: failed to record assignment to %s: %E\n"),
|
|---|
| 547 | exp->assign.dst);
|
|---|
| 548 | }
|
|---|
| 549 | gldelf32ebmip_find_exp_assignment (exp->assign.src);
|
|---|
| 550 | break;
|
|---|
| 551 |
|
|---|
| 552 | case etree_binary:
|
|---|
| 553 | gldelf32ebmip_find_exp_assignment (exp->binary.lhs);
|
|---|
| 554 | gldelf32ebmip_find_exp_assignment (exp->binary.rhs);
|
|---|
| 555 | break;
|
|---|
| 556 |
|
|---|
| 557 | case etree_trinary:
|
|---|
| 558 | gldelf32ebmip_find_exp_assignment (exp->trinary.cond);
|
|---|
| 559 | gldelf32ebmip_find_exp_assignment (exp->trinary.lhs);
|
|---|
| 560 | gldelf32ebmip_find_exp_assignment (exp->trinary.rhs);
|
|---|
| 561 | break;
|
|---|
| 562 |
|
|---|
| 563 | case etree_unary:
|
|---|
| 564 | gldelf32ebmip_find_exp_assignment (exp->unary.child);
|
|---|
| 565 | break;
|
|---|
| 566 |
|
|---|
| 567 | default:
|
|---|
| 568 | break;
|
|---|
| 569 | }
|
|---|
| 570 | }
|
|---|
| 571 |
|
|---|
| 572 | /* Place an orphan section. We use this to put random SHF_ALLOC
|
|---|
| 573 | sections in the right segment. */
|
|---|
| 574 |
|
|---|
| 575 | static asection *hold_section;
|
|---|
| 576 | static lang_output_section_statement_type *hold_use;
|
|---|
| 577 | static lang_output_section_statement_type *hold_text;
|
|---|
| 578 | static lang_output_section_statement_type *hold_rodata;
|
|---|
| 579 | static lang_output_section_statement_type *hold_data;
|
|---|
| 580 | static lang_output_section_statement_type *hold_bss;
|
|---|
| 581 | static lang_output_section_statement_type *hold_rel;
|
|---|
| 582 |
|
|---|
| 583 | /*ARGSUSED*/
|
|---|
| 584 | static boolean
|
|---|
| 585 | gldelf32ebmip_place_orphan (file, s)
|
|---|
| 586 | lang_input_statement_type *file;
|
|---|
| 587 | asection *s;
|
|---|
| 588 | {
|
|---|
| 589 | lang_output_section_statement_type *place;
|
|---|
| 590 | asection *snew, **pps;
|
|---|
| 591 | lang_statement_list_type *old;
|
|---|
| 592 | lang_statement_list_type add;
|
|---|
| 593 | etree_type *address;
|
|---|
| 594 | const char *secname, *ps;
|
|---|
| 595 | lang_output_section_statement_type *os;
|
|---|
| 596 |
|
|---|
| 597 | if ((s->flags & SEC_ALLOC) == 0)
|
|---|
| 598 | return false;
|
|---|
| 599 |
|
|---|
| 600 | /* Look through the script to see where to place this section. */
|
|---|
| 601 | hold_section = s;
|
|---|
| 602 | hold_use = NULL;
|
|---|
| 603 | lang_for_each_statement (gldelf32ebmip_place_section);
|
|---|
| 604 |
|
|---|
| 605 | if (hold_use != NULL)
|
|---|
| 606 | {
|
|---|
| 607 | /* We have already placed a section with this name. */
|
|---|
| 608 | wild_doit (&hold_use->children, s, hold_use, file);
|
|---|
| 609 | return true;
|
|---|
| 610 | }
|
|---|
| 611 |
|
|---|
| 612 | secname = bfd_get_section_name (s->owner, s);
|
|---|
| 613 |
|
|---|
| 614 | /* If this is a final link, then always put .gnu.warning.SYMBOL
|
|---|
| 615 | sections into the .text section to get them out of the way. */
|
|---|
| 616 | if (! link_info.shared
|
|---|
| 617 | && ! link_info.relocateable
|
|---|
| 618 | && strncmp (secname, ".gnu.warning.", sizeof ".gnu.warning." - 1) == 0
|
|---|
| 619 | && hold_text != NULL)
|
|---|
| 620 | {
|
|---|
| 621 | wild_doit (&hold_text->children, s, hold_text, file);
|
|---|
| 622 | return true;
|
|---|
| 623 | }
|
|---|
| 624 |
|
|---|
| 625 | /* Decide which segment the section should go in based on the
|
|---|
| 626 | section name and section flags. */
|
|---|
| 627 | place = NULL;
|
|---|
| 628 | if ((s->flags & SEC_HAS_CONTENTS) == 0
|
|---|
| 629 | && hold_bss != NULL)
|
|---|
| 630 | place = hold_bss;
|
|---|
| 631 | else if ((s->flags & SEC_READONLY) == 0
|
|---|
| 632 | && hold_data != NULL)
|
|---|
| 633 | place = hold_data;
|
|---|
| 634 | else if (strncmp (secname, ".rel", 4) == 0
|
|---|
| 635 | && hold_rel != NULL)
|
|---|
| 636 | place = hold_rel;
|
|---|
| 637 | else if ((s->flags & SEC_CODE) == 0
|
|---|
| 638 | && (s->flags & SEC_READONLY) != 0
|
|---|
| 639 | && hold_rodata != NULL)
|
|---|
| 640 | place = hold_rodata;
|
|---|
| 641 | else if ((s->flags & SEC_READONLY) != 0
|
|---|
| 642 | && hold_text != NULL)
|
|---|
| 643 | place = hold_text;
|
|---|
| 644 | if (place == NULL)
|
|---|
| 645 | return false;
|
|---|
| 646 |
|
|---|
| 647 | /* Create the section in the output file, and put it in the right
|
|---|
| 648 | place. This shuffling is to make the output file look neater. */
|
|---|
| 649 | snew = bfd_make_section (output_bfd, secname);
|
|---|
| 650 | if (snew == NULL)
|
|---|
| 651 | einfo (_("%P%F: output format %s cannot represent section called %s\n"),
|
|---|
| 652 | output_bfd->xvec->name, secname);
|
|---|
| 653 | if (place->bfd_section != NULL)
|
|---|
| 654 | {
|
|---|
| 655 | for (pps = &output_bfd->sections; *pps != snew; pps = &(*pps)->next)
|
|---|
| 656 | ;
|
|---|
| 657 | *pps = snew->next;
|
|---|
| 658 | snew->next = place->bfd_section->next;
|
|---|
| 659 | place->bfd_section->next = snew;
|
|---|
| 660 | }
|
|---|
| 661 |
|
|---|
| 662 | /* Start building a list of statements for this section. */
|
|---|
| 663 | old = stat_ptr;
|
|---|
| 664 | stat_ptr = &add;
|
|---|
| 665 | lang_list_init (stat_ptr);
|
|---|
| 666 |
|
|---|
| 667 | /* If the name of the section is representable in C, then create
|
|---|
| 668 | symbols to mark the start and the end of the section. */
|
|---|
| 669 | for (ps = secname; *ps != '\0'; ps++)
|
|---|
| 670 | if (! isalnum (*ps) && *ps != '_')
|
|---|
| 671 | break;
|
|---|
| 672 | if (*ps == '\0' && config.build_constructors)
|
|---|
| 673 | {
|
|---|
| 674 | char *symname;
|
|---|
| 675 |
|
|---|
| 676 | symname = (char *) xmalloc (ps - secname + sizeof "__start_");
|
|---|
| 677 | sprintf (symname, "__start_%s", secname);
|
|---|
| 678 | lang_add_assignment (exp_assop ('=', symname,
|
|---|
| 679 | exp_unop (ALIGN_K,
|
|---|
| 680 | exp_intop ((bfd_vma) 1
|
|---|
| 681 | << s->alignment_power))));
|
|---|
| 682 | }
|
|---|
| 683 |
|
|---|
| 684 | if (! link_info.relocateable)
|
|---|
| 685 | address = NULL;
|
|---|
| 686 | else
|
|---|
| 687 | address = exp_intop ((bfd_vma) 0);
|
|---|
| 688 |
|
|---|
| 689 | lang_enter_output_section_statement (secname, address, 0,
|
|---|
| 690 | (bfd_vma) 0,
|
|---|
| 691 | (etree_type *) NULL,
|
|---|
| 692 | (etree_type *) NULL,
|
|---|
| 693 | (etree_type *) NULL);
|
|---|
| 694 |
|
|---|
| 695 | os = lang_output_section_statement_lookup (secname);
|
|---|
| 696 | wild_doit (&os->children, s, os, file);
|
|---|
| 697 |
|
|---|
| 698 | lang_leave_output_section_statement
|
|---|
| 699 | ((bfd_vma) 0, "*default*",
|
|---|
| 700 | (struct lang_output_section_phdr_list *) NULL, "*default*");
|
|---|
| 701 | stat_ptr = &add;
|
|---|
| 702 |
|
|---|
| 703 | if (*ps == '\0' && config.build_constructors)
|
|---|
| 704 | {
|
|---|
| 705 | char *symname;
|
|---|
| 706 |
|
|---|
| 707 | symname = (char *) xmalloc (ps - secname + sizeof "__stop_");
|
|---|
| 708 | sprintf (symname, "__stop_%s", secname);
|
|---|
| 709 | lang_add_assignment (exp_assop ('=', symname,
|
|---|
| 710 | exp_nameop (NAME, ".")));
|
|---|
| 711 | }
|
|---|
| 712 |
|
|---|
| 713 | /* Now stick the new statement list right after PLACE. */
|
|---|
| 714 | *add.tail = place->header.next;
|
|---|
| 715 | place->header.next = add.head;
|
|---|
| 716 |
|
|---|
| 717 | stat_ptr = old;
|
|---|
| 718 |
|
|---|
| 719 | return true;
|
|---|
| 720 | }
|
|---|
| 721 |
|
|---|
| 722 | static void
|
|---|
| 723 | gldelf32ebmip_place_section (s)
|
|---|
| 724 | lang_statement_union_type *s;
|
|---|
| 725 | {
|
|---|
| 726 | lang_output_section_statement_type *os;
|
|---|
| 727 |
|
|---|
| 728 | if (s->header.type != lang_output_section_statement_enum)
|
|---|
| 729 | return;
|
|---|
| 730 |
|
|---|
| 731 | os = &s->output_section_statement;
|
|---|
| 732 |
|
|---|
| 733 | if (strcmp (os->name, hold_section->name) == 0)
|
|---|
| 734 | hold_use = os;
|
|---|
| 735 |
|
|---|
| 736 | if (strcmp (os->name, ".text") == 0)
|
|---|
| 737 | hold_text = os;
|
|---|
| 738 | else if (strcmp (os->name, ".rodata") == 0)
|
|---|
| 739 | hold_rodata = os;
|
|---|
| 740 | else if (strcmp (os->name, ".data") == 0)
|
|---|
| 741 | hold_data = os;
|
|---|
| 742 | else if (strcmp (os->name, ".bss") == 0)
|
|---|
| 743 | hold_bss = os;
|
|---|
| 744 | else if (hold_rel == NULL
|
|---|
| 745 | && os->bfd_section != NULL
|
|---|
| 746 | && strncmp (os->name, ".rel", 4) == 0)
|
|---|
| 747 | hold_rel = os;
|
|---|
| 748 | }
|
|---|
| 749 |
|
|---|
| 750 | static char *
|
|---|
| 751 | gldelf32ebmip_get_script(isfile)
|
|---|
| 752 | int *isfile;
|
|---|
| 753 | {
|
|---|
| 754 | *isfile = 0;
|
|---|
| 755 |
|
|---|
| 756 | if (link_info.relocateable == true && config.build_constructors == true)
|
|---|
| 757 | return "OUTPUT_FORMAT(\"elf32-bigmips\", \"elf32-bigmips\",\n\
|
|---|
| 758 | \"elf32-littlemips\")\n\
|
|---|
| 759 | OUTPUT_ARCH(mips)\n\
|
|---|
| 760 | ENTRY(_start)\n\
|
|---|
| 761 | /* For some reason, the Solaris linker makes bad executables\n\
|
|---|
| 762 | if gld -r is used and the intermediate file has sections starting\n\
|
|---|
| 763 | at non-zero addresses. Could be a Solaris ld bug, could be a GNU ld\n\
|
|---|
| 764 | bug. But for now assigning the zero vmas works. */\n\
|
|---|
| 765 | SECTIONS\n\
|
|---|
| 766 | {\n\
|
|---|
| 767 | /* Read-only sections, merged into text segment: */\n\
|
|---|
| 768 | .interp 0 : { *(.interp) }\n\
|
|---|
| 769 | .reginfo 0 : { *(.reginfo) }\n\
|
|---|
| 770 | .dynamic 0 : { *(.dynamic) }\n\
|
|---|
| 771 | .dynstr 0 : { *(.dynstr) }\n\
|
|---|
| 772 | .dynsym 0 : { *(.dynsym) }\n\
|
|---|
| 773 | .hash 0 : { *(.hash) }\n\
|
|---|
| 774 | .rel.text 0 : { *(.rel.text) }\n\
|
|---|
| 775 | .rela.text 0 : { *(.rela.text) }\n\
|
|---|
| 776 | .rel.data 0 : { *(.rel.data) }\n\
|
|---|
| 777 | .rela.data 0 : { *(.rela.data) }\n\
|
|---|
| 778 | .rel.rodata 0 : { *(.rel.rodata) }\n\
|
|---|
| 779 | .rela.rodata 0 : { *(.rela.rodata) }\n\
|
|---|
| 780 | .rel.got 0 : { *(.rel.got) }\n\
|
|---|
| 781 | .rela.got 0 : { *(.rela.got) }\n\
|
|---|
| 782 | .rel.ctors 0 : { *(.rel.ctors) }\n\
|
|---|
| 783 | .rela.ctors 0 : { *(.rela.ctors) }\n\
|
|---|
| 784 | .rel.dtors 0 : { *(.rel.dtors) }\n\
|
|---|
| 785 | .rela.dtors 0 : { *(.rela.dtors) }\n\
|
|---|
| 786 | .rel.init 0 : { *(.rel.init) }\n\
|
|---|
| 787 | .rela.init 0 : { *(.rela.init) }\n\
|
|---|
| 788 | .rel.fini 0 : { *(.rel.fini) }\n\
|
|---|
| 789 | .rela.fini 0 : { *(.rela.fini) }\n\
|
|---|
| 790 | .rel.bss 0 : { *(.rel.bss) }\n\
|
|---|
| 791 | .rela.bss 0 : { *(.rela.bss) }\n\
|
|---|
| 792 | .rel.plt 0 : { *(.rel.plt) }\n\
|
|---|
| 793 | .rela.plt 0 : { *(.rela.plt) }\n\
|
|---|
| 794 | .rodata 0 : { *(.rodata) }\n\
|
|---|
| 795 | .rodata1 0 : { *(.rodata1) }\n\
|
|---|
| 796 | .init 0 : { *(.init) } =0\n\
|
|---|
| 797 | .text 0 :\n\
|
|---|
| 798 | {\n\
|
|---|
| 799 | *(.text)\n\
|
|---|
| 800 | *(.stub)\n\
|
|---|
| 801 | /* .gnu.warning sections are handled specially by elf32.em. */\n\
|
|---|
| 802 | *(.gnu.warning)\n\
|
|---|
| 803 | } =0\n\
|
|---|
| 804 | .fini 0 : { *(.fini) } =0\n\
|
|---|
| 805 | /* Adjust the address for the data segment. We want to adjust up to\n\
|
|---|
| 806 | the same address within the page on the next page up. It would\n\
|
|---|
| 807 | be more correct to do this:\n\
|
|---|
| 808 | The current expression does not correctly handle the case of a\n\
|
|---|
| 809 | text segment ending precisely at the end of a page; it causes the\n\
|
|---|
| 810 | data segment to skip a page. The above expression does not have\n\
|
|---|
| 811 | this problem, but it will currently (2/95) cause BFD to allocate\n\
|
|---|
| 812 | a single segment, combining both text and data, for this case.\n\
|
|---|
| 813 | This will prevent the text segment from being shared among\n\
|
|---|
| 814 | multiple executions of the program; I think that is more\n\
|
|---|
| 815 | important than losing a page of the virtual address space (note\n\
|
|---|
| 816 | that no actual memory is lost; the page which is skipped can not\n\
|
|---|
| 817 | be referenced). */\n\
|
|---|
| 818 | .data 0 :\n\
|
|---|
| 819 | {\n\
|
|---|
| 820 | *(.data)\n\
|
|---|
| 821 | CONSTRUCTORS\n\
|
|---|
| 822 | }\n\
|
|---|
| 823 | .data1 0 : { *(.data1) }\n\
|
|---|
| 824 | .ctors 0 : { *(.ctors) }\n\
|
|---|
| 825 | .dtors 0 : { *(.dtors) }\n\
|
|---|
| 826 | .got 0 :\n\
|
|---|
| 827 | {\n\
|
|---|
| 828 | *(.got.plt) *(.got)\n\
|
|---|
| 829 | }\n\
|
|---|
| 830 | /* We want the small data sections together, so single-instruction offsets\n\
|
|---|
| 831 | can access them all, and initialized data all before uninitialized, so\n\
|
|---|
| 832 | we can shorten the on-disk segment size. */\n\
|
|---|
| 833 | .sdata 0 : { *(.sdata) }\n\
|
|---|
| 834 | .sbss 0 : { *(.sbss) *(.scommon) }\n\
|
|---|
| 835 | .bss 0 :\n\
|
|---|
| 836 | {\n\
|
|---|
| 837 | *(.dynbss)\n\
|
|---|
| 838 | *(.bss)\n\
|
|---|
| 839 | *(COMMON)\n\
|
|---|
| 840 | }\n\
|
|---|
| 841 | /* These are needed for ELF backends which have not yet been\n\
|
|---|
| 842 | converted to the new style linker. */\n\
|
|---|
| 843 | .stab 0 : { *(.stab) }\n\
|
|---|
| 844 | .stabstr 0 : { *(.stabstr) }\n\
|
|---|
| 845 | /* DWARF debug sections.\n\
|
|---|
| 846 | Symbols in the .debug DWARF section are relative to the beginning of the\n\
|
|---|
| 847 | section so we begin .debug at 0. It's not clear yet what needs to happen\n\
|
|---|
| 848 | for the others. */\n\
|
|---|
| 849 | .debug 0 : { *(.debug) }\n\
|
|---|
| 850 | .debug_srcinfo 0 : { *(.debug_srcinfo) }\n\
|
|---|
| 851 | .debug_aranges 0 : { *(.debug_aranges) }\n\
|
|---|
| 852 | .debug_pubnames 0 : { *(.debug_pubnames) }\n\
|
|---|
| 853 | .debug_sfnames 0 : { *(.debug_sfnames) }\n\
|
|---|
| 854 | .line 0 : { *(.line) }\n\
|
|---|
| 855 | /* These must appear regardless of . */\n\
|
|---|
| 856 | .gptab.sdata : { *(.gptab.data) *(.gptab.sdata) }\n\
|
|---|
| 857 | .gptab.sbss : { *(.gptab.bss) *(.gptab.sbss) }\n\
|
|---|
| 858 | }\n\n";
|
|---|
| 859 | else if (link_info.relocateable == true)
|
|---|
| 860 | return "OUTPUT_FORMAT(\"elf32-bigmips\", \"elf32-bigmips\",\n\
|
|---|
| 861 | \"elf32-littlemips\")\n\
|
|---|
| 862 | OUTPUT_ARCH(mips)\n\
|
|---|
| 863 | ENTRY(_start)\n\
|
|---|
| 864 | /* For some reason, the Solaris linker makes bad executables\n\
|
|---|
| 865 | if gld -r is used and the intermediate file has sections starting\n\
|
|---|
| 866 | at non-zero addresses. Could be a Solaris ld bug, could be a GNU ld\n\
|
|---|
| 867 | bug. But for now assigning the zero vmas works. */\n\
|
|---|
| 868 | SECTIONS\n\
|
|---|
| 869 | {\n\
|
|---|
| 870 | /* Read-only sections, merged into text segment: */\n\
|
|---|
| 871 | .interp 0 : { *(.interp) }\n\
|
|---|
| 872 | .reginfo 0 : { *(.reginfo) }\n\
|
|---|
| 873 | .dynamic 0 : { *(.dynamic) }\n\
|
|---|
| 874 | .dynstr 0 : { *(.dynstr) }\n\
|
|---|
| 875 | .dynsym 0 : { *(.dynsym) }\n\
|
|---|
| 876 | .hash 0 : { *(.hash) }\n\
|
|---|
| 877 | .rel.text 0 : { *(.rel.text) }\n\
|
|---|
| 878 | .rela.text 0 : { *(.rela.text) }\n\
|
|---|
| 879 | .rel.data 0 : { *(.rel.data) }\n\
|
|---|
| 880 | .rela.data 0 : { *(.rela.data) }\n\
|
|---|
| 881 | .rel.rodata 0 : { *(.rel.rodata) }\n\
|
|---|
| 882 | .rela.rodata 0 : { *(.rela.rodata) }\n\
|
|---|
| 883 | .rel.got 0 : { *(.rel.got) }\n\
|
|---|
| 884 | .rela.got 0 : { *(.rela.got) }\n\
|
|---|
| 885 | .rel.ctors 0 : { *(.rel.ctors) }\n\
|
|---|
| 886 | .rela.ctors 0 : { *(.rela.ctors) }\n\
|
|---|
| 887 | .rel.dtors 0 : { *(.rel.dtors) }\n\
|
|---|
| 888 | .rela.dtors 0 : { *(.rela.dtors) }\n\
|
|---|
| 889 | .rel.init 0 : { *(.rel.init) }\n\
|
|---|
| 890 | .rela.init 0 : { *(.rela.init) }\n\
|
|---|
| 891 | .rel.fini 0 : { *(.rel.fini) }\n\
|
|---|
| 892 | .rela.fini 0 : { *(.rela.fini) }\n\
|
|---|
| 893 | .rel.bss 0 : { *(.rel.bss) }\n\
|
|---|
| 894 | .rela.bss 0 : { *(.rela.bss) }\n\
|
|---|
| 895 | .rel.plt 0 : { *(.rel.plt) }\n\
|
|---|
| 896 | .rela.plt 0 : { *(.rela.plt) }\n\
|
|---|
| 897 | .rodata 0 : { *(.rodata) }\n\
|
|---|
| 898 | .rodata1 0 : { *(.rodata1) }\n\
|
|---|
| 899 | .init 0 : { *(.init) } =0\n\
|
|---|
| 900 | .text 0 :\n\
|
|---|
| 901 | {\n\
|
|---|
| 902 | *(.text)\n\
|
|---|
| 903 | *(.stub)\n\
|
|---|
| 904 | /* .gnu.warning sections are handled specially by elf32.em. */\n\
|
|---|
| 905 | *(.gnu.warning)\n\
|
|---|
| 906 | } =0\n\
|
|---|
| 907 | .fini 0 : { *(.fini) } =0\n\
|
|---|
| 908 | /* Adjust the address for the data segment. We want to adjust up to\n\
|
|---|
| 909 | the same address within the page on the next page up. It would\n\
|
|---|
| 910 | be more correct to do this:\n\
|
|---|
| 911 | The current expression does not correctly handle the case of a\n\
|
|---|
| 912 | text segment ending precisely at the end of a page; it causes the\n\
|
|---|
| 913 | data segment to skip a page. The above expression does not have\n\
|
|---|
| 914 | this problem, but it will currently (2/95) cause BFD to allocate\n\
|
|---|
| 915 | a single segment, combining both text and data, for this case.\n\
|
|---|
| 916 | This will prevent the text segment from being shared among\n\
|
|---|
| 917 | multiple executions of the program; I think that is more\n\
|
|---|
| 918 | important than losing a page of the virtual address space (note\n\
|
|---|
| 919 | that no actual memory is lost; the page which is skipped can not\n\
|
|---|
| 920 | be referenced). */\n\
|
|---|
| 921 | .data 0 :\n\
|
|---|
| 922 | {\n\
|
|---|
| 923 | *(.data)\n\
|
|---|
| 924 | }\n\
|
|---|
| 925 | .data1 0 : { *(.data1) }\n\
|
|---|
| 926 | .ctors 0 : { *(.ctors) }\n\
|
|---|
| 927 | .dtors 0 : { *(.dtors) }\n\
|
|---|
| 928 | .got 0 :\n\
|
|---|
| 929 | {\n\
|
|---|
| 930 | *(.got.plt) *(.got)\n\
|
|---|
| 931 | }\n\
|
|---|
| 932 | /* We want the small data sections together, so single-instruction offsets\n\
|
|---|
| 933 | can access them all, and initialized data all before uninitialized, so\n\
|
|---|
| 934 | we can shorten the on-disk segment size. */\n\
|
|---|
| 935 | .sdata 0 : { *(.sdata) }\n\
|
|---|
| 936 | .sbss 0 : { *(.sbss) *(.scommon) }\n\
|
|---|
| 937 | .bss 0 :\n\
|
|---|
| 938 | {\n\
|
|---|
| 939 | *(.dynbss)\n\
|
|---|
| 940 | *(.bss)\n\
|
|---|
| 941 | *(COMMON)\n\
|
|---|
| 942 | }\n\
|
|---|
| 943 | /* These are needed for ELF backends which have not yet been\n\
|
|---|
| 944 | converted to the new style linker. */\n\
|
|---|
| 945 | .stab 0 : { *(.stab) }\n\
|
|---|
| 946 | .stabstr 0 : { *(.stabstr) }\n\
|
|---|
| 947 | /* DWARF debug sections.\n\
|
|---|
| 948 | Symbols in the .debug DWARF section are relative to the beginning of the\n\
|
|---|
| 949 | section so we begin .debug at 0. It's not clear yet what needs to happen\n\
|
|---|
| 950 | for the others. */\n\
|
|---|
| 951 | .debug 0 : { *(.debug) }\n\
|
|---|
| 952 | .debug_srcinfo 0 : { *(.debug_srcinfo) }\n\
|
|---|
| 953 | .debug_aranges 0 : { *(.debug_aranges) }\n\
|
|---|
| 954 | .debug_pubnames 0 : { *(.debug_pubnames) }\n\
|
|---|
| 955 | .debug_sfnames 0 : { *(.debug_sfnames) }\n\
|
|---|
| 956 | .line 0 : { *(.line) }\n\
|
|---|
| 957 | /* These must appear regardless of . */\n\
|
|---|
| 958 | .gptab.sdata : { *(.gptab.data) *(.gptab.sdata) }\n\
|
|---|
| 959 | .gptab.sbss : { *(.gptab.bss) *(.gptab.sbss) }\n\
|
|---|
| 960 | }\n\n";
|
|---|
| 961 | else if (!config.text_read_only)
|
|---|
| 962 | return "OUTPUT_FORMAT(\"elf32-bigmips\", \"elf32-bigmips\",\n\
|
|---|
| 963 | \"elf32-littlemips\")\n\
|
|---|
| 964 | OUTPUT_ARCH(mips)\n\
|
|---|
| 965 | ENTRY(_start)\n\
|
|---|
| 966 | SEARCH_DIR(/usr/local/mips-elf/lib);\n\
|
|---|
| 967 | /* Do we need any of these for elf?\n\
|
|---|
| 968 | __DYNAMIC = 0; */\n\
|
|---|
| 969 | SECTIONS\n\
|
|---|
| 970 | {\n\
|
|---|
| 971 | /* Read-only sections, merged into text segment: */\n\
|
|---|
| 972 | . = 0x0400000;\n\
|
|---|
| 973 | .interp : { *(.interp) }\n\
|
|---|
| 974 | .reginfo : { *(.reginfo) }\n\
|
|---|
| 975 | .dynamic : { *(.dynamic) }\n\
|
|---|
| 976 | .dynstr : { *(.dynstr) }\n\
|
|---|
| 977 | .dynsym : { *(.dynsym) }\n\
|
|---|
| 978 | .hash : { *(.hash) }\n\
|
|---|
| 979 | .rel.text : { *(.rel.text) }\n\
|
|---|
| 980 | .rela.text : { *(.rela.text) }\n\
|
|---|
| 981 | .rel.data : { *(.rel.data) }\n\
|
|---|
| 982 | .rela.data : { *(.rela.data) }\n\
|
|---|
| 983 | .rel.rodata : { *(.rel.rodata) }\n\
|
|---|
| 984 | .rela.rodata : { *(.rela.rodata) }\n\
|
|---|
| 985 | .rel.got : { *(.rel.got) }\n\
|
|---|
| 986 | .rela.got : { *(.rela.got) }\n\
|
|---|
| 987 | .rel.ctors : { *(.rel.ctors) }\n\
|
|---|
| 988 | .rela.ctors : { *(.rela.ctors) }\n\
|
|---|
| 989 | .rel.dtors : { *(.rel.dtors) }\n\
|
|---|
| 990 | .rela.dtors : { *(.rela.dtors) }\n\
|
|---|
| 991 | .rel.init : { *(.rel.init) }\n\
|
|---|
| 992 | .rela.init : { *(.rela.init) }\n\
|
|---|
| 993 | .rel.fini : { *(.rel.fini) }\n\
|
|---|
| 994 | .rela.fini : { *(.rela.fini) }\n\
|
|---|
| 995 | .rel.bss : { *(.rel.bss) }\n\
|
|---|
| 996 | .rela.bss : { *(.rela.bss) }\n\
|
|---|
| 997 | .rel.plt : { *(.rel.plt) }\n\
|
|---|
| 998 | .rela.plt : { *(.rela.plt) }\n\
|
|---|
| 999 | .rodata : { *(.rodata) }\n\
|
|---|
| 1000 | .rodata1 : { *(.rodata1) }\n\
|
|---|
| 1001 | .init : { *(.init) } =0\n\
|
|---|
| 1002 | .text :\n\
|
|---|
| 1003 | {\n\
|
|---|
| 1004 | _ftext = . ;\n\
|
|---|
| 1005 | *(.text)\n\
|
|---|
| 1006 | *(.stub)\n\
|
|---|
| 1007 | /* .gnu.warning sections are handled specially by elf32.em. */\n\
|
|---|
| 1008 | *(.gnu.warning)\n\
|
|---|
| 1009 | } =0\n\
|
|---|
| 1010 | _etext = .;\n\
|
|---|
| 1011 | PROVIDE (etext = .);\n\
|
|---|
| 1012 | .fini : { *(.fini) } =0\n\
|
|---|
| 1013 | /* Adjust the address for the data segment. We want to adjust up to\n\
|
|---|
| 1014 | the same address within the page on the next page up. It would\n\
|
|---|
| 1015 | be more correct to do this:\n\
|
|---|
| 1016 | . = .;\n\
|
|---|
| 1017 | The current expression does not correctly handle the case of a\n\
|
|---|
| 1018 | text segment ending precisely at the end of a page; it causes the\n\
|
|---|
| 1019 | data segment to skip a page. The above expression does not have\n\
|
|---|
| 1020 | this problem, but it will currently (2/95) cause BFD to allocate\n\
|
|---|
| 1021 | a single segment, combining both text and data, for this case.\n\
|
|---|
| 1022 | This will prevent the text segment from being shared among\n\
|
|---|
| 1023 | multiple executions of the program; I think that is more\n\
|
|---|
| 1024 | important than losing a page of the virtual address space (note\n\
|
|---|
| 1025 | that no actual memory is lost; the page which is skipped can not\n\
|
|---|
| 1026 | be referenced). */\n\
|
|---|
| 1027 | . += . - 0x0400000;\n\
|
|---|
| 1028 | .data :\n\
|
|---|
| 1029 | {\n\
|
|---|
| 1030 | _fdata = . ;\n\
|
|---|
| 1031 | *(.data)\n\
|
|---|
| 1032 | CONSTRUCTORS\n\
|
|---|
| 1033 | }\n\
|
|---|
| 1034 | .data1 : { *(.data1) }\n\
|
|---|
| 1035 | .ctors : { *(.ctors) }\n\
|
|---|
| 1036 | .dtors : { *(.dtors) }\n\
|
|---|
| 1037 | _gp = ALIGN(16) + 0x7ff0;\n\
|
|---|
| 1038 | .got :\n\
|
|---|
| 1039 | {\n\
|
|---|
| 1040 | *(.got.plt) *(.got)\n\
|
|---|
| 1041 | }\n\
|
|---|
| 1042 | /* We want the small data sections together, so single-instruction offsets\n\
|
|---|
| 1043 | can access them all, and initialized data all before uninitialized, so\n\
|
|---|
| 1044 | we can shorten the on-disk segment size. */\n\
|
|---|
| 1045 | .sdata : { *(.sdata) }\n\
|
|---|
| 1046 | .lit8 : { *(.lit8) }\n\
|
|---|
| 1047 | .lit4 : { *(.lit4) }\n\
|
|---|
| 1048 | _edata = .;\n\
|
|---|
| 1049 | PROVIDE (edata = .);\n\
|
|---|
| 1050 | __bss_start = .;\n\
|
|---|
| 1051 | _fbss = .;\n\
|
|---|
| 1052 | .sbss : { *(.sbss) *(.scommon) }\n\
|
|---|
| 1053 | .bss :\n\
|
|---|
| 1054 | {\n\
|
|---|
| 1055 | *(.dynbss)\n\
|
|---|
| 1056 | *(.bss)\n\
|
|---|
| 1057 | *(COMMON)\n\
|
|---|
| 1058 | }\n\
|
|---|
| 1059 | _end = . ;\n\
|
|---|
| 1060 | PROVIDE (end = .);\n\
|
|---|
| 1061 | /* These are needed for ELF backends which have not yet been\n\
|
|---|
| 1062 | converted to the new style linker. */\n\
|
|---|
| 1063 | .stab 0 : { *(.stab) }\n\
|
|---|
| 1064 | .stabstr 0 : { *(.stabstr) }\n\
|
|---|
| 1065 | /* DWARF debug sections.\n\
|
|---|
| 1066 | Symbols in the .debug DWARF section are relative to the beginning of the\n\
|
|---|
| 1067 | section so we begin .debug at 0. It's not clear yet what needs to happen\n\
|
|---|
| 1068 | for the others. */\n\
|
|---|
| 1069 | .debug 0 : { *(.debug) }\n\
|
|---|
| 1070 | .debug_srcinfo 0 : { *(.debug_srcinfo) }\n\
|
|---|
| 1071 | .debug_aranges 0 : { *(.debug_aranges) }\n\
|
|---|
| 1072 | .debug_pubnames 0 : { *(.debug_pubnames) }\n\
|
|---|
| 1073 | .debug_sfnames 0 : { *(.debug_sfnames) }\n\
|
|---|
| 1074 | .line 0 : { *(.line) }\n\
|
|---|
| 1075 | /* These must appear regardless of . */\n\
|
|---|
| 1076 | .gptab.sdata : { *(.gptab.data) *(.gptab.sdata) }\n\
|
|---|
| 1077 | .gptab.sbss : { *(.gptab.bss) *(.gptab.sbss) }\n\
|
|---|
| 1078 | }\n\n";
|
|---|
| 1079 | else if (!config.magic_demand_paged)
|
|---|
| 1080 | return "OUTPUT_FORMAT(\"elf32-bigmips\", \"elf32-bigmips\",\n\
|
|---|
| 1081 | \"elf32-littlemips\")\n\
|
|---|
| 1082 | OUTPUT_ARCH(mips)\n\
|
|---|
| 1083 | ENTRY(_start)\n\
|
|---|
| 1084 | SEARCH_DIR(/usr/local/mips-elf/lib);\n\
|
|---|
| 1085 | /* Do we need any of these for elf?\n\
|
|---|
| 1086 | __DYNAMIC = 0; */\n\
|
|---|
| 1087 | SECTIONS\n\
|
|---|
| 1088 | {\n\
|
|---|
| 1089 | /* Read-only sections, merged into text segment: */\n\
|
|---|
| 1090 | . = 0x0400000;\n\
|
|---|
| 1091 | .interp : { *(.interp) }\n\
|
|---|
| 1092 | .reginfo : { *(.reginfo) }\n\
|
|---|
| 1093 | .dynamic : { *(.dynamic) }\n\
|
|---|
| 1094 | .dynstr : { *(.dynstr) }\n\
|
|---|
| 1095 | .dynsym : { *(.dynsym) }\n\
|
|---|
| 1096 | .hash : { *(.hash) }\n\
|
|---|
| 1097 | .rel.text : { *(.rel.text) }\n\
|
|---|
| 1098 | .rela.text : { *(.rela.text) }\n\
|
|---|
| 1099 | .rel.data : { *(.rel.data) }\n\
|
|---|
| 1100 | .rela.data : { *(.rela.data) }\n\
|
|---|
| 1101 | .rel.rodata : { *(.rel.rodata) }\n\
|
|---|
| 1102 | .rela.rodata : { *(.rela.rodata) }\n\
|
|---|
| 1103 | .rel.got : { *(.rel.got) }\n\
|
|---|
| 1104 | .rela.got : { *(.rela.got) }\n\
|
|---|
| 1105 | .rel.ctors : { *(.rel.ctors) }\n\
|
|---|
| 1106 | .rela.ctors : { *(.rela.ctors) }\n\
|
|---|
| 1107 | .rel.dtors : { *(.rel.dtors) }\n\
|
|---|
| 1108 | .rela.dtors : { *(.rela.dtors) }\n\
|
|---|
| 1109 | .rel.init : { *(.rel.init) }\n\
|
|---|
| 1110 | .rela.init : { *(.rela.init) }\n\
|
|---|
| 1111 | .rel.fini : { *(.rel.fini) }\n\
|
|---|
| 1112 | .rela.fini : { *(.rela.fini) }\n\
|
|---|
| 1113 | .rel.bss : { *(.rel.bss) }\n\
|
|---|
| 1114 | .rela.bss : { *(.rela.bss) }\n\
|
|---|
| 1115 | .rel.plt : { *(.rel.plt) }\n\
|
|---|
| 1116 | .rela.plt : { *(.rela.plt) }\n\
|
|---|
| 1117 | .rodata : { *(.rodata) }\n\
|
|---|
| 1118 | .rodata1 : { *(.rodata1) }\n\
|
|---|
| 1119 | .init : { *(.init) } =0\n\
|
|---|
| 1120 | .text :\n\
|
|---|
| 1121 | {\n\
|
|---|
| 1122 | _ftext = . ;\n\
|
|---|
| 1123 | *(.text)\n\
|
|---|
| 1124 | *(.stub)\n\
|
|---|
| 1125 | /* .gnu.warning sections are handled specially by elf32.em. */\n\
|
|---|
| 1126 | *(.gnu.warning)\n\
|
|---|
| 1127 | } =0\n\
|
|---|
| 1128 | _etext = .;\n\
|
|---|
| 1129 | PROVIDE (etext = .);\n\
|
|---|
| 1130 | .fini : { *(.fini) } =0\n\
|
|---|
| 1131 | /* Adjust the address for the data segment. We want to adjust up to\n\
|
|---|
| 1132 | the same address within the page on the next page up. It would\n\
|
|---|
| 1133 | be more correct to do this:\n\
|
|---|
| 1134 | . = 0x10000000;\n\
|
|---|
| 1135 | The current expression does not correctly handle the case of a\n\
|
|---|
| 1136 | text segment ending precisely at the end of a page; it causes the\n\
|
|---|
| 1137 | data segment to skip a page. The above expression does not have\n\
|
|---|
| 1138 | this problem, but it will currently (2/95) cause BFD to allocate\n\
|
|---|
| 1139 | a single segment, combining both text and data, for this case.\n\
|
|---|
| 1140 | This will prevent the text segment from being shared among\n\
|
|---|
| 1141 | multiple executions of the program; I think that is more\n\
|
|---|
| 1142 | important than losing a page of the virtual address space (note\n\
|
|---|
| 1143 | that no actual memory is lost; the page which is skipped can not\n\
|
|---|
| 1144 | be referenced). */\n\
|
|---|
| 1145 | . += 0x10000000 - 0x0400000;\n\
|
|---|
| 1146 | .data :\n\
|
|---|
| 1147 | {\n\
|
|---|
| 1148 | _fdata = . ;\n\
|
|---|
| 1149 | *(.data)\n\
|
|---|
| 1150 | CONSTRUCTORS\n\
|
|---|
| 1151 | }\n\
|
|---|
| 1152 | .data1 : { *(.data1) }\n\
|
|---|
| 1153 | .ctors : { *(.ctors) }\n\
|
|---|
| 1154 | .dtors : { *(.dtors) }\n\
|
|---|
| 1155 | _gp = ALIGN(16) + 0x7ff0;\n\
|
|---|
| 1156 | .got :\n\
|
|---|
| 1157 | {\n\
|
|---|
| 1158 | *(.got.plt) *(.got)\n\
|
|---|
| 1159 | }\n\
|
|---|
| 1160 | /* We want the small data sections together, so single-instruction offsets\n\
|
|---|
| 1161 | can access them all, and initialized data all before uninitialized, so\n\
|
|---|
| 1162 | we can shorten the on-disk segment size. */\n\
|
|---|
| 1163 | .sdata : { *(.sdata) }\n\
|
|---|
| 1164 | .lit8 : { *(.lit8) }\n\
|
|---|
| 1165 | .lit4 : { *(.lit4) }\n\
|
|---|
| 1166 | _edata = .;\n\
|
|---|
| 1167 | PROVIDE (edata = .);\n\
|
|---|
| 1168 | __bss_start = .;\n\
|
|---|
| 1169 | _fbss = .;\n\
|
|---|
| 1170 | .sbss : { *(.sbss) *(.scommon) }\n\
|
|---|
| 1171 | .bss :\n\
|
|---|
| 1172 | {\n\
|
|---|
| 1173 | *(.dynbss)\n\
|
|---|
| 1174 | *(.bss)\n\
|
|---|
| 1175 | *(COMMON)\n\
|
|---|
| 1176 | }\n\
|
|---|
| 1177 | _end = . ;\n\
|
|---|
| 1178 | PROVIDE (end = .);\n\
|
|---|
| 1179 | /* These are needed for ELF backends which have not yet been\n\
|
|---|
| 1180 | converted to the new style linker. */\n\
|
|---|
| 1181 | .stab 0 : { *(.stab) }\n\
|
|---|
| 1182 | .stabstr 0 : { *(.stabstr) }\n\
|
|---|
| 1183 | /* DWARF debug sections.\n\
|
|---|
| 1184 | Symbols in the .debug DWARF section are relative to the beginning of the\n\
|
|---|
| 1185 | section so we begin .debug at 0. It's not clear yet what needs to happen\n\
|
|---|
| 1186 | for the others. */\n\
|
|---|
| 1187 | .debug 0 : { *(.debug) }\n\
|
|---|
| 1188 | .debug_srcinfo 0 : { *(.debug_srcinfo) }\n\
|
|---|
| 1189 | .debug_aranges 0 : { *(.debug_aranges) }\n\
|
|---|
| 1190 | .debug_pubnames 0 : { *(.debug_pubnames) }\n\
|
|---|
| 1191 | .debug_sfnames 0 : { *(.debug_sfnames) }\n\
|
|---|
| 1192 | .line 0 : { *(.line) }\n\
|
|---|
| 1193 | /* These must appear regardless of . */\n\
|
|---|
| 1194 | .gptab.sdata : { *(.gptab.data) *(.gptab.sdata) }\n\
|
|---|
| 1195 | .gptab.sbss : { *(.gptab.bss) *(.gptab.sbss) }\n\
|
|---|
| 1196 | }\n\n";
|
|---|
| 1197 | else if (link_info.shared)
|
|---|
| 1198 | return "OUTPUT_FORMAT(\"elf32-bigmips\", \"elf32-bigmips\",\n\
|
|---|
| 1199 | \"elf32-littlemips\")\n\
|
|---|
| 1200 | OUTPUT_ARCH(mips)\n\
|
|---|
| 1201 | ENTRY(_start)\n\
|
|---|
| 1202 | SEARCH_DIR(/usr/local/mips-elf/lib);\n\
|
|---|
| 1203 | /* Do we need any of these for elf?\n\
|
|---|
| 1204 | __DYNAMIC = 0; */\n\
|
|---|
| 1205 | SECTIONS\n\
|
|---|
| 1206 | {\n\
|
|---|
| 1207 | /* Read-only sections, merged into text segment: */\n\
|
|---|
| 1208 | . = 0x5ffe0000 + SIZEOF_HEADERS;\n\
|
|---|
| 1209 | .reginfo : { *(.reginfo) }\n\
|
|---|
| 1210 | .dynamic : { *(.dynamic) }\n\
|
|---|
| 1211 | .dynstr : { *(.dynstr) }\n\
|
|---|
| 1212 | .dynsym : { *(.dynsym) }\n\
|
|---|
| 1213 | .hash : { *(.hash) }\n\
|
|---|
| 1214 | .rel.text : { *(.rel.text) }\n\
|
|---|
| 1215 | .rela.text : { *(.rela.text) }\n\
|
|---|
| 1216 | .rel.data : { *(.rel.data) }\n\
|
|---|
| 1217 | .rela.data : { *(.rela.data) }\n\
|
|---|
| 1218 | .rel.rodata : { *(.rel.rodata) }\n\
|
|---|
| 1219 | .rela.rodata : { *(.rela.rodata) }\n\
|
|---|
| 1220 | .rel.got : { *(.rel.got) }\n\
|
|---|
| 1221 | .rela.got : { *(.rela.got) }\n\
|
|---|
| 1222 | .rel.ctors : { *(.rel.ctors) }\n\
|
|---|
| 1223 | .rela.ctors : { *(.rela.ctors) }\n\
|
|---|
| 1224 | .rel.dtors : { *(.rel.dtors) }\n\
|
|---|
| 1225 | .rela.dtors : { *(.rela.dtors) }\n\
|
|---|
| 1226 | .rel.init : { *(.rel.init) }\n\
|
|---|
| 1227 | .rela.init : { *(.rela.init) }\n\
|
|---|
| 1228 | .rel.fini : { *(.rel.fini) }\n\
|
|---|
| 1229 | .rela.fini : { *(.rela.fini) }\n\
|
|---|
| 1230 | .rel.bss : { *(.rel.bss) }\n\
|
|---|
| 1231 | .rela.bss : { *(.rela.bss) }\n\
|
|---|
| 1232 | .rel.plt : { *(.rel.plt) }\n\
|
|---|
| 1233 | .rela.plt : { *(.rela.plt) }\n\
|
|---|
| 1234 | .rodata : { *(.rodata) }\n\
|
|---|
| 1235 | .rodata1 : { *(.rodata1) }\n\
|
|---|
| 1236 | .init : { *(.init) } =0\n\
|
|---|
| 1237 | .text :\n\
|
|---|
| 1238 | {\n\
|
|---|
| 1239 | *(.text)\n\
|
|---|
| 1240 | *(.stub)\n\
|
|---|
| 1241 | /* .gnu.warning sections are handled specially by elf32.em. */\n\
|
|---|
| 1242 | *(.gnu.warning)\n\
|
|---|
| 1243 | } =0\n\
|
|---|
| 1244 | .fini : { *(.fini) } =0\n\
|
|---|
| 1245 | /* Adjust the address for the data segment. We want to adjust up to\n\
|
|---|
| 1246 | the same address within the page on the next page up. It would\n\
|
|---|
| 1247 | be more correct to do this:\n\
|
|---|
| 1248 | . = 0x10000000;\n\
|
|---|
| 1249 | The current expression does not correctly handle the case of a\n\
|
|---|
| 1250 | text segment ending precisely at the end of a page; it causes the\n\
|
|---|
| 1251 | data segment to skip a page. The above expression does not have\n\
|
|---|
| 1252 | this problem, but it will currently (2/95) cause BFD to allocate\n\
|
|---|
| 1253 | a single segment, combining both text and data, for this case.\n\
|
|---|
| 1254 | This will prevent the text segment from being shared among\n\
|
|---|
| 1255 | multiple executions of the program; I think that is more\n\
|
|---|
| 1256 | important than losing a page of the virtual address space (note\n\
|
|---|
| 1257 | that no actual memory is lost; the page which is skipped can not\n\
|
|---|
| 1258 | be referenced). */\n\
|
|---|
| 1259 | . += 0x10000;\n\
|
|---|
| 1260 | .data :\n\
|
|---|
| 1261 | {\n\
|
|---|
| 1262 | *(.data)\n\
|
|---|
| 1263 | CONSTRUCTORS\n\
|
|---|
| 1264 | }\n\
|
|---|
| 1265 | .data1 : { *(.data1) }\n\
|
|---|
| 1266 | .ctors : { *(.ctors) }\n\
|
|---|
| 1267 | .dtors : { *(.dtors) }\n\
|
|---|
| 1268 | _gp = ALIGN(16) + 0x7ff0;\n\
|
|---|
| 1269 | .got :\n\
|
|---|
| 1270 | {\n\
|
|---|
| 1271 | *(.got.plt) *(.got)\n\
|
|---|
| 1272 | }\n\
|
|---|
| 1273 | /* We want the small data sections together, so single-instruction offsets\n\
|
|---|
| 1274 | can access them all, and initialized data all before uninitialized, so\n\
|
|---|
| 1275 | we can shorten the on-disk segment size. */\n\
|
|---|
| 1276 | .sdata : { *(.sdata) }\n\
|
|---|
| 1277 | .lit8 : { *(.lit8) }\n\
|
|---|
| 1278 | .lit4 : { *(.lit4) }\n\
|
|---|
| 1279 | .sbss : { *(.sbss) *(.scommon) }\n\
|
|---|
| 1280 | .bss :\n\
|
|---|
| 1281 | {\n\
|
|---|
| 1282 | *(.dynbss)\n\
|
|---|
| 1283 | *(.bss)\n\
|
|---|
| 1284 | *(COMMON)\n\
|
|---|
| 1285 | }\n\
|
|---|
| 1286 | /* These are needed for ELF backends which have not yet been\n\
|
|---|
| 1287 | converted to the new style linker. */\n\
|
|---|
| 1288 | .stab 0 : { *(.stab) }\n\
|
|---|
| 1289 | .stabstr 0 : { *(.stabstr) }\n\
|
|---|
| 1290 | /* DWARF debug sections.\n\
|
|---|
| 1291 | Symbols in the .debug DWARF section are relative to the beginning of the\n\
|
|---|
| 1292 | section so we begin .debug at 0. It's not clear yet what needs to happen\n\
|
|---|
| 1293 | for the others. */\n\
|
|---|
| 1294 | .debug 0 : { *(.debug) }\n\
|
|---|
| 1295 | .debug_srcinfo 0 : { *(.debug_srcinfo) }\n\
|
|---|
| 1296 | .debug_aranges 0 : { *(.debug_aranges) }\n\
|
|---|
| 1297 | .debug_pubnames 0 : { *(.debug_pubnames) }\n\
|
|---|
| 1298 | .debug_sfnames 0 : { *(.debug_sfnames) }\n\
|
|---|
| 1299 | .line 0 : { *(.line) }\n\
|
|---|
| 1300 | /* These must appear regardless of . */\n\
|
|---|
| 1301 | .gptab.sdata : { *(.gptab.data) *(.gptab.sdata) }\n\
|
|---|
| 1302 | .gptab.sbss : { *(.gptab.bss) *(.gptab.sbss) }\n\
|
|---|
| 1303 | }\n\n";
|
|---|
| 1304 | else
|
|---|
| 1305 | return "OUTPUT_FORMAT(\"elf32-bigmips\", \"elf32-bigmips\",\n\
|
|---|
| 1306 | \"elf32-littlemips\")\n\
|
|---|
| 1307 | OUTPUT_ARCH(mips)\n\
|
|---|
| 1308 | ENTRY(_start)\n\
|
|---|
| 1309 | SEARCH_DIR(/usr/local/mips-elf/lib);\n\
|
|---|
| 1310 | /* Do we need any of these for elf?\n\
|
|---|
| 1311 | __DYNAMIC = 0; */\n\
|
|---|
| 1312 | SECTIONS\n\
|
|---|
| 1313 | {\n\
|
|---|
| 1314 | /* Read-only sections, merged into text segment: */\n\
|
|---|
| 1315 | . = 0x0400000;\n\
|
|---|
| 1316 | .interp : { *(.interp) }\n\
|
|---|
| 1317 | .reginfo : { *(.reginfo) }\n\
|
|---|
| 1318 | .dynamic : { *(.dynamic) }\n\
|
|---|
| 1319 | .dynstr : { *(.dynstr) }\n\
|
|---|
| 1320 | .dynsym : { *(.dynsym) }\n\
|
|---|
| 1321 | .hash : { *(.hash) }\n\
|
|---|
| 1322 | .rel.text : { *(.rel.text) }\n\
|
|---|
| 1323 | .rela.text : { *(.rela.text) }\n\
|
|---|
| 1324 | .rel.data : { *(.rel.data) }\n\
|
|---|
| 1325 | .rela.data : { *(.rela.data) }\n\
|
|---|
| 1326 | .rel.rodata : { *(.rel.rodata) }\n\
|
|---|
| 1327 | .rela.rodata : { *(.rela.rodata) }\n\
|
|---|
| 1328 | .rel.got : { *(.rel.got) }\n\
|
|---|
| 1329 | .rela.got : { *(.rela.got) }\n\
|
|---|
| 1330 | .rel.ctors : { *(.rel.ctors) }\n\
|
|---|
| 1331 | .rela.ctors : { *(.rela.ctors) }\n\
|
|---|
| 1332 | .rel.dtors : { *(.rel.dtors) }\n\
|
|---|
| 1333 | .rela.dtors : { *(.rela.dtors) }\n\
|
|---|
| 1334 | .rel.init : { *(.rel.init) }\n\
|
|---|
| 1335 | .rela.init : { *(.rela.init) }\n\
|
|---|
| 1336 | .rel.fini : { *(.rel.fini) }\n\
|
|---|
| 1337 | .rela.fini : { *(.rela.fini) }\n\
|
|---|
| 1338 | .rel.bss : { *(.rel.bss) }\n\
|
|---|
| 1339 | .rela.bss : { *(.rela.bss) }\n\
|
|---|
| 1340 | .rel.plt : { *(.rel.plt) }\n\
|
|---|
| 1341 | .rela.plt : { *(.rela.plt) }\n\
|
|---|
| 1342 | .rodata : { *(.rodata) }\n\
|
|---|
| 1343 | .rodata1 : { *(.rodata1) }\n\
|
|---|
| 1344 | .init : { *(.init) } =0\n\
|
|---|
| 1345 | .text :\n\
|
|---|
| 1346 | {\n\
|
|---|
| 1347 | _ftext = . ;\n\
|
|---|
| 1348 | *(.text)\n\
|
|---|
| 1349 | *(.stub)\n\
|
|---|
| 1350 | /* .gnu.warning sections are handled specially by elf32.em. */\n\
|
|---|
| 1351 | *(.gnu.warning)\n\
|
|---|
| 1352 | } =0\n\
|
|---|
| 1353 | _etext = .;\n\
|
|---|
| 1354 | PROVIDE (etext = .);\n\
|
|---|
| 1355 | .fini : { *(.fini) } =0\n\
|
|---|
| 1356 | /* Adjust the address for the data segment. We want to adjust up to\n\
|
|---|
| 1357 | the same address within the page on the next page up. It would\n\
|
|---|
| 1358 | be more correct to do this:\n\
|
|---|
| 1359 | . = 0x10000000;\n\
|
|---|
| 1360 | The current expression does not correctly handle the case of a\n\
|
|---|
| 1361 | text segment ending precisely at the end of a page; it causes the\n\
|
|---|
| 1362 | data segment to skip a page. The above expression does not have\n\
|
|---|
| 1363 | this problem, but it will currently (2/95) cause BFD to allocate\n\
|
|---|
| 1364 | a single segment, combining both text and data, for this case.\n\
|
|---|
| 1365 | This will prevent the text segment from being shared among\n\
|
|---|
| 1366 | multiple executions of the program; I think that is more\n\
|
|---|
| 1367 | important than losing a page of the virtual address space (note\n\
|
|---|
| 1368 | that no actual memory is lost; the page which is skipped can not\n\
|
|---|
| 1369 | be referenced). */\n\
|
|---|
| 1370 | . += 0x10000000 - 0x0400000;\n\
|
|---|
| 1371 | .data :\n\
|
|---|
| 1372 | {\n\
|
|---|
| 1373 | _fdata = . ;\n\
|
|---|
| 1374 | *(.data)\n\
|
|---|
| 1375 | CONSTRUCTORS\n\
|
|---|
| 1376 | }\n\
|
|---|
| 1377 | .data1 : { *(.data1) }\n\
|
|---|
| 1378 | .ctors : { *(.ctors) }\n\
|
|---|
| 1379 | .dtors : { *(.dtors) }\n\
|
|---|
| 1380 | _gp = ALIGN(16) + 0x7ff0;\n\
|
|---|
| 1381 | .got :\n\
|
|---|
| 1382 | {\n\
|
|---|
| 1383 | *(.got.plt) *(.got)\n\
|
|---|
| 1384 | }\n\
|
|---|
| 1385 | /* We want the small data sections together, so single-instruction offsets\n\
|
|---|
| 1386 | can access them all, and initialized data all before uninitialized, so\n\
|
|---|
| 1387 | we can shorten the on-disk segment size. */\n\
|
|---|
| 1388 | .sdata : { *(.sdata) }\n\
|
|---|
| 1389 | .lit8 : { *(.lit8) }\n\
|
|---|
| 1390 | .lit4 : { *(.lit4) }\n\
|
|---|
| 1391 | _edata = .;\n\
|
|---|
| 1392 | PROVIDE (edata = .);\n\
|
|---|
| 1393 | __bss_start = .;\n\
|
|---|
| 1394 | _fbss = .;\n\
|
|---|
| 1395 | .sbss : { *(.sbss) *(.scommon) }\n\
|
|---|
| 1396 | .bss :\n\
|
|---|
| 1397 | {\n\
|
|---|
| 1398 | *(.dynbss)\n\
|
|---|
| 1399 | *(.bss)\n\
|
|---|
| 1400 | *(COMMON)\n\
|
|---|
| 1401 | }\n\
|
|---|
| 1402 | _end = . ;\n\
|
|---|
| 1403 | PROVIDE (end = .);\n\
|
|---|
| 1404 | /* These are needed for ELF backends which have not yet been\n\
|
|---|
| 1405 | converted to the new style linker. */\n\
|
|---|
| 1406 | .stab 0 : { *(.stab) }\n\
|
|---|
| 1407 | .stabstr 0 : { *(.stabstr) }\n\
|
|---|
| 1408 | /* DWARF debug sections.\n\
|
|---|
| 1409 | Symbols in the .debug DWARF section are relative to the beginning of the\n\
|
|---|
| 1410 | section so we begin .debug at 0. It's not clear yet what needs to happen\n\
|
|---|
| 1411 | for the others. */\n\
|
|---|
| 1412 | .debug 0 : { *(.debug) }\n\
|
|---|
| 1413 | .debug_srcinfo 0 : { *(.debug_srcinfo) }\n\
|
|---|
| 1414 | .debug_aranges 0 : { *(.debug_aranges) }\n\
|
|---|
| 1415 | .debug_pubnames 0 : { *(.debug_pubnames) }\n\
|
|---|
| 1416 | .debug_sfnames 0 : { *(.debug_sfnames) }\n\
|
|---|
| 1417 | .line 0 : { *(.line) }\n\
|
|---|
| 1418 | /* These must appear regardless of . */\n\
|
|---|
| 1419 | .gptab.sdata : { *(.gptab.data) *(.gptab.sdata) }\n\
|
|---|
| 1420 | .gptab.sbss : { *(.gptab.bss) *(.gptab.sbss) }\n\
|
|---|
| 1421 | }\n\n";
|
|---|
| 1422 | }
|
|---|
| 1423 |
|
|---|
| 1424 | struct ld_emulation_xfer_struct ld_elf32ebmip_emulation =
|
|---|
| 1425 | {
|
|---|
| 1426 | gldelf32ebmip_before_parse,
|
|---|
| 1427 | syslib_default,
|
|---|
| 1428 | hll_default,
|
|---|
| 1429 | after_parse_default,
|
|---|
| 1430 | gldelf32ebmip_after_open,
|
|---|
| 1431 | after_allocation_default,
|
|---|
| 1432 | set_output_arch_default,
|
|---|
| 1433 | ldemul_default_target,
|
|---|
| 1434 | gldelf32ebmip_before_allocation,
|
|---|
| 1435 | gldelf32ebmip_get_script,
|
|---|
| 1436 | "elf32ebmip",
|
|---|
| 1437 | "elf32-bigmips",
|
|---|
| 1438 | NULL,
|
|---|
| 1439 | NULL,
|
|---|
| 1440 | gldelf32ebmip_open_dynamic_archive,
|
|---|
| 1441 | gldelf32ebmip_place_orphan
|
|---|
| 1442 | };
|
|---|