link_elf.c (722b8e3cb62bd3e43035527e08fe058d5046901d) link_elf.c (7ef5c19b219e47684afd9d8d9126df39edc8d885)
1/*-
2 * SPDX-License-Identifier: BSD-2-Clause
3 *
4 * Copyright (c) 1998-2000 Doug Rabson
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions

--- 344 unchanged lines hidden (view full) ---

353{
354 if (filename == NULL)
355 printf("kldload: %s\n", s);
356 else
357 printf("kldload: %s: %s\n", filename, s);
358}
359
360static void
1/*-
2 * SPDX-License-Identifier: BSD-2-Clause
3 *
4 * Copyright (c) 1998-2000 Doug Rabson
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions

--- 344 unchanged lines hidden (view full) ---

353{
354 if (filename == NULL)
355 printf("kldload: %s\n", s);
356 else
357 printf("kldload: %s: %s\n", filename, s);
358}
359
360static void
361link_elf_invoke_ctors(caddr_t addr, size_t size)
361link_elf_invoke_cbs(caddr_t addr, size_t size)
362{
363 void (**ctor)(void);
364 size_t i, cnt;
365
366 if (addr == NULL || size == 0)
367 return;
368 cnt = size / sizeof(*ctor);
369 ctor = (void *)addr;
370 for (i = 0; i < cnt; i++) {
371 if (ctor[i] != NULL)
372 (*ctor[i])();
373 }
374}
375
362{
363 void (**ctor)(void);
364 size_t i, cnt;
365
366 if (addr == NULL || size == 0)
367 return;
368 cnt = size / sizeof(*ctor);
369 ctor = (void *)addr;
370 for (i = 0; i < cnt; i++) {
371 if (ctor[i] != NULL)
372 (*ctor[i])();
373 }
374}
375
376static void
377link_elf_invoke_ctors(linker_file_t lf)
378{
379 KASSERT(lf->ctors_invoked == LF_NONE,
380 ("%s: file %s ctor state %d",
381 __func__, lf->filename, lf->ctors_invoked));
382
383 link_elf_invoke_cbs(lf->ctors_addr, lf->ctors_size);
384 lf->ctors_invoked = LF_CTORS;
385}
386
376/*
377 * Actions performed after linking/loading both the preloaded kernel and any
378 * modules; whether preloaded or dynamicly loaded.
379 */
380static int
381link_elf_link_common_finish(linker_file_t lf)
382{
383#ifdef GDB

--- 14 unchanged lines hidden (view full) ---

398 strcpy(newfilename, lf->filename);
399 ef->gdb.l_name = newfilename;
400 ef->gdb.l_ld = ef->dynamic;
401 link_elf_add_gdb(&ef->gdb);
402 GDB_STATE(RT_CONSISTENT);
403#endif
404
405 /* Invoke .ctors */
387/*
388 * Actions performed after linking/loading both the preloaded kernel and any
389 * modules; whether preloaded or dynamicly loaded.
390 */
391static int
392link_elf_link_common_finish(linker_file_t lf)
393{
394#ifdef GDB

--- 14 unchanged lines hidden (view full) ---

409 strcpy(newfilename, lf->filename);
410 ef->gdb.l_name = newfilename;
411 ef->gdb.l_ld = ef->dynamic;
412 link_elf_add_gdb(&ef->gdb);
413 GDB_STATE(RT_CONSISTENT);
414#endif
415
416 /* Invoke .ctors */
406 link_elf_invoke_ctors(lf->ctors_addr, lf->ctors_size);
417 link_elf_invoke_ctors(lf);
407 return (0);
408}
409
410#ifdef RELOCATABLE_KERNEL
411/*
412 * __startkernel and __endkernel are symbols set up as relocation canaries.
413 *
414 * They are defined in locore to reference linker script symbols at the

--- 1632 unchanged lines hidden ---
418 return (0);
419}
420
421#ifdef RELOCATABLE_KERNEL
422/*
423 * __startkernel and __endkernel are symbols set up as relocation canaries.
424 *
425 * They are defined in locore to reference linker script symbols at the

--- 1632 unchanged lines hidden ---