diff options
author | Glenn Elliott <gelliott@cs.unc.edu> | 2012-03-04 19:47:13 -0500 |
---|---|---|
committer | Glenn Elliott <gelliott@cs.unc.edu> | 2012-03-04 19:47:13 -0500 |
commit | c71c03bda1e86c9d5198c5d83f712e695c4f2a1e (patch) | |
tree | ecb166cb3e2b7e2adb3b5e292245fefd23381ac8 /arch/um/kernel | |
parent | ea53c912f8a86a8567697115b6a0d8152beee5c8 (diff) | |
parent | 6a00f206debf8a5c8899055726ad127dbeeed098 (diff) |
Merge branch 'mpi-master' into wip-k-fmlpwip-k-fmlp
Conflicts:
litmus/sched_cedf.c
Diffstat (limited to 'arch/um/kernel')
-rw-r--r-- | arch/um/kernel/Makefile | 1 | ||||
-rw-r--r-- | arch/um/kernel/dyn.lds.S | 14 | ||||
-rw-r--r-- | arch/um/kernel/early_printk.c | 33 | ||||
-rw-r--r-- | arch/um/kernel/exec.c | 3 | ||||
-rw-r--r-- | arch/um/kernel/irq.c | 87 | ||||
-rw-r--r-- | arch/um/kernel/ptrace.c | 23 | ||||
-rw-r--r-- | arch/um/kernel/skas/mmu.c | 2 | ||||
-rw-r--r-- | arch/um/kernel/smp.c | 5 | ||||
-rw-r--r-- | arch/um/kernel/trap.c | 24 | ||||
-rw-r--r-- | arch/um/kernel/uml.lds.S | 19 |
10 files changed, 117 insertions, 94 deletions
diff --git a/arch/um/kernel/Makefile b/arch/um/kernel/Makefile index 1119233597a1..c4491c15afb2 100644 --- a/arch/um/kernel/Makefile +++ b/arch/um/kernel/Makefile | |||
@@ -17,6 +17,7 @@ obj-y = config.o exec.o exitcode.o init_task.o irq.o ksyms.o mem.o \ | |||
17 | obj-$(CONFIG_BLK_DEV_INITRD) += initrd.o | 17 | obj-$(CONFIG_BLK_DEV_INITRD) += initrd.o |
18 | obj-$(CONFIG_GPROF) += gprof_syms.o | 18 | obj-$(CONFIG_GPROF) += gprof_syms.o |
19 | obj-$(CONFIG_GCOV) += gmon_syms.o | 19 | obj-$(CONFIG_GCOV) += gmon_syms.o |
20 | obj-$(CONFIG_EARLY_PRINTK) += early_printk.o | ||
20 | 21 | ||
21 | USER_OBJS := config.o | 22 | USER_OBJS := config.o |
22 | 23 | ||
diff --git a/arch/um/kernel/dyn.lds.S b/arch/um/kernel/dyn.lds.S index 69268014dd8e..a3cab6d3ae02 100644 --- a/arch/um/kernel/dyn.lds.S +++ b/arch/um/kernel/dyn.lds.S | |||
@@ -50,8 +50,18 @@ SECTIONS | |||
50 | .rela.got : { *(.rela.got) } | 50 | .rela.got : { *(.rela.got) } |
51 | .rel.bss : { *(.rel.bss .rel.bss.* .rel.gnu.linkonce.b.*) } | 51 | .rel.bss : { *(.rel.bss .rel.bss.* .rel.gnu.linkonce.b.*) } |
52 | .rela.bss : { *(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*) } | 52 | .rela.bss : { *(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*) } |
53 | .rel.plt : { *(.rel.plt) } | 53 | .rel.plt : { |
54 | .rela.plt : { *(.rela.plt) } | 54 | *(.rel.plt) |
55 | PROVIDE_HIDDEN(__rel_iplt_start = .); | ||
56 | *(.rel.iplt) | ||
57 | PROVIDE_HIDDEN(__rel_iplt_end = .); | ||
58 | } | ||
59 | .rela.plt : { | ||
60 | *(.rela.plt) | ||
61 | PROVIDE_HIDDEN(__rela_iplt_start = .); | ||
62 | *(.rela.iplt) | ||
63 | PROVIDE_HIDDEN(__rela_iplt_end = .); | ||
64 | } | ||
55 | .init : { | 65 | .init : { |
56 | KEEP (*(.init)) | 66 | KEEP (*(.init)) |
57 | } =0x90909090 | 67 | } =0x90909090 |
diff --git a/arch/um/kernel/early_printk.c b/arch/um/kernel/early_printk.c new file mode 100644 index 000000000000..ec649bf72f68 --- /dev/null +++ b/arch/um/kernel/early_printk.c | |||
@@ -0,0 +1,33 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2011 Richard Weinberger <richrd@nod.at> | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify | ||
5 | * it under the terms of the GNU General Public License version 2 as | ||
6 | * published by the Free Software Foundation. | ||
7 | */ | ||
8 | |||
9 | #include <linux/kernel.h> | ||
10 | #include <linux/console.h> | ||
11 | #include <linux/init.h> | ||
12 | #include "os.h" | ||
13 | |||
14 | static void early_console_write(struct console *con, const char *s, unsigned int n) | ||
15 | { | ||
16 | um_early_printk(s, n); | ||
17 | } | ||
18 | |||
19 | static struct console early_console = { | ||
20 | .name = "earlycon", | ||
21 | .write = early_console_write, | ||
22 | .flags = CON_BOOT, | ||
23 | .index = -1, | ||
24 | }; | ||
25 | |||
26 | static int __init setup_early_printk(char *buf) | ||
27 | { | ||
28 | register_console(&early_console); | ||
29 | |||
30 | return 0; | ||
31 | } | ||
32 | |||
33 | early_param("earlyprintk", setup_early_printk); | ||
diff --git a/arch/um/kernel/exec.c b/arch/um/kernel/exec.c index 49b5e1eb3262..09bd7b585726 100644 --- a/arch/um/kernel/exec.c +++ b/arch/um/kernel/exec.c | |||
@@ -5,7 +5,6 @@ | |||
5 | 5 | ||
6 | #include "linux/stddef.h" | 6 | #include "linux/stddef.h" |
7 | #include "linux/fs.h" | 7 | #include "linux/fs.h" |
8 | #include "linux/smp_lock.h" | ||
9 | #include "linux/ptrace.h" | 8 | #include "linux/ptrace.h" |
10 | #include "linux/sched.h" | 9 | #include "linux/sched.h" |
11 | #include "linux/slab.h" | 10 | #include "linux/slab.h" |
@@ -78,13 +77,11 @@ long sys_execve(const char __user *file, const char __user *const __user *argv, | |||
78 | long error; | 77 | long error; |
79 | char *filename; | 78 | char *filename; |
80 | 79 | ||
81 | lock_kernel(); | ||
82 | filename = getname(file); | 80 | filename = getname(file); |
83 | error = PTR_ERR(filename); | 81 | error = PTR_ERR(filename); |
84 | if (IS_ERR(filename)) goto out; | 82 | if (IS_ERR(filename)) goto out; |
85 | error = execve1(filename, argv, env); | 83 | error = execve1(filename, argv, env); |
86 | putname(filename); | 84 | putname(filename); |
87 | out: | 85 | out: |
88 | unlock_kernel(); | ||
89 | return error; | 86 | return error; |
90 | } | 87 | } |
diff --git a/arch/um/kernel/irq.c b/arch/um/kernel/irq.c index a3f0b04d7101..9e485c770308 100644 --- a/arch/um/kernel/irq.c +++ b/arch/um/kernel/irq.c | |||
@@ -18,50 +18,6 @@ | |||
18 | #include "os.h" | 18 | #include "os.h" |
19 | 19 | ||
20 | /* | 20 | /* |
21 | * Generic, controller-independent functions: | ||
22 | */ | ||
23 | |||
24 | int show_interrupts(struct seq_file *p, void *v) | ||
25 | { | ||
26 | int i = *(loff_t *) v, j; | ||
27 | struct irqaction * action; | ||
28 | unsigned long flags; | ||
29 | |||
30 | if (i == 0) { | ||
31 | seq_printf(p, " "); | ||
32 | for_each_online_cpu(j) | ||
33 | seq_printf(p, "CPU%d ",j); | ||
34 | seq_putc(p, '\n'); | ||
35 | } | ||
36 | |||
37 | if (i < NR_IRQS) { | ||
38 | raw_spin_lock_irqsave(&irq_desc[i].lock, flags); | ||
39 | action = irq_desc[i].action; | ||
40 | if (!action) | ||
41 | goto skip; | ||
42 | seq_printf(p, "%3d: ",i); | ||
43 | #ifndef CONFIG_SMP | ||
44 | seq_printf(p, "%10u ", kstat_irqs(i)); | ||
45 | #else | ||
46 | for_each_online_cpu(j) | ||
47 | seq_printf(p, "%10u ", kstat_irqs_cpu(i, j)); | ||
48 | #endif | ||
49 | seq_printf(p, " %14s", irq_desc[i].chip->typename); | ||
50 | seq_printf(p, " %s", action->name); | ||
51 | |||
52 | for (action=action->next; action; action = action->next) | ||
53 | seq_printf(p, ", %s", action->name); | ||
54 | |||
55 | seq_putc(p, '\n'); | ||
56 | skip: | ||
57 | raw_spin_unlock_irqrestore(&irq_desc[i].lock, flags); | ||
58 | } else if (i == NR_IRQS) | ||
59 | seq_putc(p, '\n'); | ||
60 | |||
61 | return 0; | ||
62 | } | ||
63 | |||
64 | /* | ||
65 | * This list is accessed under irq_lock, except in sigio_handler, | 21 | * This list is accessed under irq_lock, except in sigio_handler, |
66 | * where it is safe from being modified. IRQ handlers won't change it - | 22 | * where it is safe from being modified. IRQ handlers won't change it - |
67 | * if an IRQ source has vanished, it will be freed by free_irqs just | 23 | * if an IRQ source has vanished, it will be freed by free_irqs just |
@@ -334,7 +290,7 @@ unsigned int do_IRQ(int irq, struct uml_pt_regs *regs) | |||
334 | { | 290 | { |
335 | struct pt_regs *old_regs = set_irq_regs((struct pt_regs *)regs); | 291 | struct pt_regs *old_regs = set_irq_regs((struct pt_regs *)regs); |
336 | irq_enter(); | 292 | irq_enter(); |
337 | __do_IRQ(irq); | 293 | generic_handle_irq(irq); |
338 | irq_exit(); | 294 | irq_exit(); |
339 | set_irq_regs(old_regs); | 295 | set_irq_regs(old_regs); |
340 | return 1; | 296 | return 1; |
@@ -360,49 +316,38 @@ EXPORT_SYMBOL(um_request_irq); | |||
360 | EXPORT_SYMBOL(reactivate_fd); | 316 | EXPORT_SYMBOL(reactivate_fd); |
361 | 317 | ||
362 | /* | 318 | /* |
363 | * irq_chip must define (startup || enable) && | 319 | * irq_chip must define at least enable/disable and ack when |
364 | * (shutdown || disable) && end | 320 | * the edge handler is used. |
365 | */ | 321 | */ |
366 | static void dummy(unsigned int irq) | 322 | static void dummy(struct irq_data *d) |
367 | { | 323 | { |
368 | } | 324 | } |
369 | 325 | ||
370 | /* This is used for everything else than the timer. */ | 326 | /* This is used for everything else than the timer. */ |
371 | static struct irq_chip normal_irq_type = { | 327 | static struct irq_chip normal_irq_type = { |
372 | .typename = "SIGIO", | 328 | .name = "SIGIO", |
373 | .release = free_irq_by_irq_and_dev, | 329 | .release = free_irq_by_irq_and_dev, |
374 | .disable = dummy, | 330 | .irq_disable = dummy, |
375 | .enable = dummy, | 331 | .irq_enable = dummy, |
376 | .ack = dummy, | 332 | .irq_ack = dummy, |
377 | .end = dummy | ||
378 | }; | 333 | }; |
379 | 334 | ||
380 | static struct irq_chip SIGVTALRM_irq_type = { | 335 | static struct irq_chip SIGVTALRM_irq_type = { |
381 | .typename = "SIGVTALRM", | 336 | .name = "SIGVTALRM", |
382 | .release = free_irq_by_irq_and_dev, | 337 | .release = free_irq_by_irq_and_dev, |
383 | .shutdown = dummy, /* never called */ | 338 | .irq_disable = dummy, |
384 | .disable = dummy, | 339 | .irq_enable = dummy, |
385 | .enable = dummy, | 340 | .irq_ack = dummy, |
386 | .ack = dummy, | ||
387 | .end = dummy | ||
388 | }; | 341 | }; |
389 | 342 | ||
390 | void __init init_IRQ(void) | 343 | void __init init_IRQ(void) |
391 | { | 344 | { |
392 | int i; | 345 | int i; |
393 | 346 | ||
394 | irq_desc[TIMER_IRQ].status = IRQ_DISABLED; | 347 | irq_set_chip_and_handler(TIMER_IRQ, &SIGVTALRM_irq_type, handle_edge_irq); |
395 | irq_desc[TIMER_IRQ].action = NULL; | 348 | |
396 | irq_desc[TIMER_IRQ].depth = 1; | 349 | for (i = 1; i < NR_IRQS; i++) |
397 | irq_desc[TIMER_IRQ].chip = &SIGVTALRM_irq_type; | 350 | irq_set_chip_and_handler(i, &normal_irq_type, handle_edge_irq); |
398 | enable_irq(TIMER_IRQ); | ||
399 | for (i = 1; i < NR_IRQS; i++) { | ||
400 | irq_desc[i].status = IRQ_DISABLED; | ||
401 | irq_desc[i].action = NULL; | ||
402 | irq_desc[i].depth = 1; | ||
403 | irq_desc[i].chip = &normal_irq_type; | ||
404 | enable_irq(i); | ||
405 | } | ||
406 | } | 351 | } |
407 | 352 | ||
408 | /* | 353 | /* |
diff --git a/arch/um/kernel/ptrace.c b/arch/um/kernel/ptrace.c index e0510496596c..701b672c1122 100644 --- a/arch/um/kernel/ptrace.c +++ b/arch/um/kernel/ptrace.c | |||
@@ -42,10 +42,12 @@ void ptrace_disable(struct task_struct *child) | |||
42 | extern int peek_user(struct task_struct * child, long addr, long data); | 42 | extern int peek_user(struct task_struct * child, long addr, long data); |
43 | extern int poke_user(struct task_struct * child, long addr, long data); | 43 | extern int poke_user(struct task_struct * child, long addr, long data); |
44 | 44 | ||
45 | long arch_ptrace(struct task_struct *child, long request, long addr, long data) | 45 | long arch_ptrace(struct task_struct *child, long request, |
46 | unsigned long addr, unsigned long data) | ||
46 | { | 47 | { |
47 | int i, ret; | 48 | int i, ret; |
48 | unsigned long __user *p = (void __user *)(unsigned long)data; | 49 | unsigned long __user *p = (void __user *)data; |
50 | void __user *vp = p; | ||
49 | 51 | ||
50 | switch (request) { | 52 | switch (request) { |
51 | /* read word at location addr. */ | 53 | /* read word at location addr. */ |
@@ -107,24 +109,20 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) | |||
107 | #endif | 109 | #endif |
108 | #ifdef PTRACE_GETFPREGS | 110 | #ifdef PTRACE_GETFPREGS |
109 | case PTRACE_GETFPREGS: /* Get the child FPU state. */ | 111 | case PTRACE_GETFPREGS: /* Get the child FPU state. */ |
110 | ret = get_fpregs((struct user_i387_struct __user *) data, | 112 | ret = get_fpregs(vp, child); |
111 | child); | ||
112 | break; | 113 | break; |
113 | #endif | 114 | #endif |
114 | #ifdef PTRACE_SETFPREGS | 115 | #ifdef PTRACE_SETFPREGS |
115 | case PTRACE_SETFPREGS: /* Set the child FPU state. */ | 116 | case PTRACE_SETFPREGS: /* Set the child FPU state. */ |
116 | ret = set_fpregs((struct user_i387_struct __user *) data, | 117 | ret = set_fpregs(vp, child); |
117 | child); | ||
118 | break; | 118 | break; |
119 | #endif | 119 | #endif |
120 | case PTRACE_GET_THREAD_AREA: | 120 | case PTRACE_GET_THREAD_AREA: |
121 | ret = ptrace_get_thread_area(child, addr, | 121 | ret = ptrace_get_thread_area(child, addr, vp); |
122 | (struct user_desc __user *) data); | ||
123 | break; | 122 | break; |
124 | 123 | ||
125 | case PTRACE_SET_THREAD_AREA: | 124 | case PTRACE_SET_THREAD_AREA: |
126 | ret = ptrace_set_thread_area(child, addr, | 125 | ret = ptrace_set_thread_area(child, addr, vp); |
127 | (struct user_desc __user *) data); | ||
128 | break; | 126 | break; |
129 | 127 | ||
130 | case PTRACE_FAULTINFO: { | 128 | case PTRACE_FAULTINFO: { |
@@ -134,7 +132,8 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) | |||
134 | * On i386, ptrace_faultinfo is smaller! | 132 | * On i386, ptrace_faultinfo is smaller! |
135 | */ | 133 | */ |
136 | ret = copy_to_user(p, &child->thread.arch.faultinfo, | 134 | ret = copy_to_user(p, &child->thread.arch.faultinfo, |
137 | sizeof(struct ptrace_faultinfo)); | 135 | sizeof(struct ptrace_faultinfo)) ? |
136 | -EIO : 0; | ||
138 | break; | 137 | break; |
139 | } | 138 | } |
140 | 139 | ||
@@ -158,7 +157,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) | |||
158 | #ifdef PTRACE_ARCH_PRCTL | 157 | #ifdef PTRACE_ARCH_PRCTL |
159 | case PTRACE_ARCH_PRCTL: | 158 | case PTRACE_ARCH_PRCTL: |
160 | /* XXX Calls ptrace on the host - needs some SMP thinking */ | 159 | /* XXX Calls ptrace on the host - needs some SMP thinking */ |
161 | ret = arch_prctl(child, data, (void *) addr); | 160 | ret = arch_prctl(child, data, (void __user *) addr); |
162 | break; | 161 | break; |
163 | #endif | 162 | #endif |
164 | default: | 163 | default: |
diff --git a/arch/um/kernel/skas/mmu.c b/arch/um/kernel/skas/mmu.c index 3d099f974785..1aee587e9c5d 100644 --- a/arch/um/kernel/skas/mmu.c +++ b/arch/um/kernel/skas/mmu.c | |||
@@ -31,7 +31,7 @@ static int init_stub_pte(struct mm_struct *mm, unsigned long proc, | |||
31 | if (!pmd) | 31 | if (!pmd) |
32 | goto out_pmd; | 32 | goto out_pmd; |
33 | 33 | ||
34 | pte = pte_alloc_map(mm, pmd, proc); | 34 | pte = pte_alloc_map(mm, NULL, pmd, proc); |
35 | if (!pte) | 35 | if (!pte) |
36 | goto out_pte; | 36 | goto out_pte; |
37 | 37 | ||
diff --git a/arch/um/kernel/smp.c b/arch/um/kernel/smp.c index 106bf27e2a9a..155206a66908 100644 --- a/arch/um/kernel/smp.c +++ b/arch/um/kernel/smp.c | |||
@@ -7,9 +7,6 @@ | |||
7 | #include "asm/pgalloc.h" | 7 | #include "asm/pgalloc.h" |
8 | #include "asm/tlb.h" | 8 | #include "asm/tlb.h" |
9 | 9 | ||
10 | /* For some reason, mmu_gathers are referenced when CONFIG_SMP is off. */ | ||
11 | DEFINE_PER_CPU(struct mmu_gather, mmu_gathers); | ||
12 | |||
13 | #ifdef CONFIG_SMP | 10 | #ifdef CONFIG_SMP |
14 | 11 | ||
15 | #include "linux/sched.h" | 12 | #include "linux/sched.h" |
@@ -173,7 +170,7 @@ void IPI_handler(int cpu) | |||
173 | break; | 170 | break; |
174 | 171 | ||
175 | case 'R': | 172 | case 'R': |
176 | set_tsk_need_resched(current); | 173 | scheduler_ipi(); |
177 | break; | 174 | break; |
178 | 175 | ||
179 | case 'S': | 176 | case 'S': |
diff --git a/arch/um/kernel/trap.c b/arch/um/kernel/trap.c index 637c6505dc00..8c7b8823d1f0 100644 --- a/arch/um/kernel/trap.c +++ b/arch/um/kernel/trap.c | |||
@@ -113,6 +113,27 @@ out_of_memory: | |||
113 | return 0; | 113 | return 0; |
114 | } | 114 | } |
115 | 115 | ||
116 | static void show_segv_info(struct uml_pt_regs *regs) | ||
117 | { | ||
118 | struct task_struct *tsk = current; | ||
119 | struct faultinfo *fi = UPT_FAULTINFO(regs); | ||
120 | |||
121 | if (!unhandled_signal(tsk, SIGSEGV)) | ||
122 | return; | ||
123 | |||
124 | if (!printk_ratelimit()) | ||
125 | return; | ||
126 | |||
127 | printk("%s%s[%d]: segfault at %lx ip %p sp %p error %x", | ||
128 | task_pid_nr(tsk) > 1 ? KERN_INFO : KERN_EMERG, | ||
129 | tsk->comm, task_pid_nr(tsk), FAULT_ADDRESS(*fi), | ||
130 | (void *)UPT_IP(regs), (void *)UPT_SP(regs), | ||
131 | fi->error_code); | ||
132 | |||
133 | print_vma_addr(KERN_CONT " in ", UPT_IP(regs)); | ||
134 | printk(KERN_CONT "\n"); | ||
135 | } | ||
136 | |||
116 | static void bad_segv(struct faultinfo fi, unsigned long ip) | 137 | static void bad_segv(struct faultinfo fi, unsigned long ip) |
117 | { | 138 | { |
118 | struct siginfo si; | 139 | struct siginfo si; |
@@ -141,6 +162,7 @@ void segv_handler(int sig, struct uml_pt_regs *regs) | |||
141 | struct faultinfo * fi = UPT_FAULTINFO(regs); | 162 | struct faultinfo * fi = UPT_FAULTINFO(regs); |
142 | 163 | ||
143 | if (UPT_IS_USER(regs) && !SEGV_IS_FIXABLE(fi)) { | 164 | if (UPT_IS_USER(regs) && !SEGV_IS_FIXABLE(fi)) { |
165 | show_segv_info(regs); | ||
144 | bad_segv(*fi, UPT_IP(regs)); | 166 | bad_segv(*fi, UPT_IP(regs)); |
145 | return; | 167 | return; |
146 | } | 168 | } |
@@ -202,6 +224,8 @@ unsigned long segv(struct faultinfo fi, unsigned long ip, int is_user, | |||
202 | address, ip); | 224 | address, ip); |
203 | } | 225 | } |
204 | 226 | ||
227 | show_segv_info(regs); | ||
228 | |||
205 | if (err == -EACCES) { | 229 | if (err == -EACCES) { |
206 | si.si_signo = SIGBUS; | 230 | si.si_signo = SIGBUS; |
207 | si.si_errno = 0; | 231 | si.si_errno = 0; |
diff --git a/arch/um/kernel/uml.lds.S b/arch/um/kernel/uml.lds.S index ec6378550671..fbd99402d4d2 100644 --- a/arch/um/kernel/uml.lds.S +++ b/arch/um/kernel/uml.lds.S | |||
@@ -22,7 +22,7 @@ SECTIONS | |||
22 | _text = .; | 22 | _text = .; |
23 | _stext = .; | 23 | _stext = .; |
24 | __init_begin = .; | 24 | __init_begin = .; |
25 | INIT_TEXT_SECTION(PAGE_SIZE) | 25 | INIT_TEXT_SECTION(0) |
26 | . = ALIGN(PAGE_SIZE); | 26 | . = ALIGN(PAGE_SIZE); |
27 | 27 | ||
28 | .text : | 28 | .text : |
@@ -43,6 +43,23 @@ SECTIONS | |||
43 | __syscall_stub_end = .; | 43 | __syscall_stub_end = .; |
44 | } | 44 | } |
45 | 45 | ||
46 | /* | ||
47 | * These are needed even in a static link, even if they wind up being empty. | ||
48 | * Newer glibc needs these __rel{,a}_iplt_{start,end} symbols. | ||
49 | */ | ||
50 | .rel.plt : { | ||
51 | *(.rel.plt) | ||
52 | PROVIDE_HIDDEN(__rel_iplt_start = .); | ||
53 | *(.rel.iplt) | ||
54 | PROVIDE_HIDDEN(__rel_iplt_end = .); | ||
55 | } | ||
56 | .rela.plt : { | ||
57 | *(.rela.plt) | ||
58 | PROVIDE_HIDDEN(__rela_iplt_start = .); | ||
59 | *(.rela.iplt) | ||
60 | PROVIDE_HIDDEN(__rela_iplt_end = .); | ||
61 | } | ||
62 | |||
46 | #include "asm/common.lds.S" | 63 | #include "asm/common.lds.S" |
47 | 64 | ||
48 | init.data : { INIT_DATA } | 65 | init.data : { INIT_DATA } |