1 #if defined __sparc__ && defined __arch64__
2 register void *__thread_self
__asm ("g7");
17 #define verbose_exec(failcode, path...) \
20 char *const arr[] = { path, NULL }; \
21 vexec (failcode, arr); \
24 __attribute__((noinline
)) void vexec (int failcode
, char *const path
[]);
25 __attribute__((noinline
)) void says (const char *str
);
26 __attribute__((noinline
)) void sayn (long num
);
27 __attribute__((noinline
)) void message (char *const path
[]);
28 __attribute__((noinline
)) int check_elf (const char *name
);
39 } prefix
[] = { { "libc-", 5 }, { "libm-", 5 },
40 { "librt-", 6 }, { "libpthread-", 11 },
41 { "librtkaio-", 10 }, { "libthread_db-", 13 } };
46 const char *remove_dirs
[] = { "/lib/tls", "/lib/i686", "/lib/tls/i486", "/lib/tls/i586", "/lib/tls/i686" };
49 #define LIBTLS "/lib/tls"
51 const char *remove_dirs
[] = { LIBTLS
};
53 for (j
= 0; j
< sizeof (remove_dirs
) / sizeof (remove_dirs
[0]); ++j
)
55 size_t rmlen
= strlen (remove_dirs
[j
]);
56 fd
= open (remove_dirs
[j
], O_RDONLY
);
58 && (ret
= getdirentries (fd
, buffer
, sizeof (buffer
), &base
))
59 >= (ssize_t
) offsetof (struct dirent
, d_name
))
61 for (base
= 0; base
+ offsetof (struct dirent
, d_name
) < ret
; )
63 struct dirent
*d
= (struct dirent
*) (buffer
+ base
);
65 for (i
= 0; i
< sizeof (prefix
) / sizeof (prefix
[0]); i
++)
66 if (! strncmp (d
->d_name
, prefix
[i
].p
, prefix
[i
].len
))
68 char *p
= d
->d_name
+ prefix
[i
].len
;
70 while (*p
== '.' || (*p
>= '0' && *p
<= '9')) p
++;
71 if (p
[0] == 's' && p
[1] == 'o' && p
[2] == '\0'
73 < sizeof (initpath
) - rmlen
- 1)
75 memcpy (initpath
, remove_dirs
[j
], rmlen
);
76 initpath
[rmlen
] = '/';
77 strcpy (initpath
+ rmlen
+ 1, d
->d_name
);
88 int ldsocfd
= open (LD_SO_CONF
, O_RDONLY
);
90 if (ldsocfd
>= 0 && fstat (ldsocfd
, &ldsocst
) >= 0)
92 char p
[ldsocst
.st_size
+ 1];
93 if (read (ldsocfd
, p
, ldsocst
.st_size
) == ldsocst
.st_size
)
95 p
[ldsocst
.st_size
] = '\0';
96 if (strstr (p
, "include ld.so.conf.d/*.conf") == NULL
)
99 ldsocfd
= open (LD_SO_CONF
, O_WRONLY
| O_TRUNC
);
102 size_t slen
= strlen ("include ld.so.conf.d/*.conf\n");
103 if (write (ldsocfd
, "include ld.so.conf.d/*.conf\n", slen
)
105 || write (ldsocfd
, p
, ldsocst
.st_size
) != ldsocst
.st_size
)
114 /* If installing bi-arch glibc, rpm sometimes doesn't unpack all files
115 before running one of the lib's %post scriptlet. /sbin/ldconfig will
116 then be run by the other arch's %post. */
117 if (! access ("/sbin/ldconfig", X_OK
))
118 verbose_exec (110, "/sbin/ldconfig", "/sbin/ldconfig");
120 if (! utimes (GCONV_MODULES_DIR
"/gconv-modules.cache", NULL
))
123 #define ICONVCONFIG "/usr/sbin/iconvconfig"
125 verbose_exec (113, ICONVCONFIG
, "/usr/sbin/iconvconfig",
126 "-o", GCONV_MODULES_DIR
"/gconv-modules.cache",
127 "--nostdlib", GCONV_MODULES_DIR
);
130 /* Check if telinit is available and the init fifo as well. */
131 if (access ("/sbin/telinit", X_OK
) || access ("/dev/initctl", F_OK
))
133 /* Check if we are not inside of some chroot, because we'd just
134 timeout and leave /etc/initrunlvl. */
135 if (readlink ("/proc/1/exe", initpath
, 256) <= 0 ||
136 readlink ("/proc/1/root", initpath
, 256) <= 0)
139 if (check_elf ("/proc/1/exe"))
140 verbose_exec (116, "/sbin/telinit", "/sbin/telinit", "u");
142 /* Check if we can safely condrestart sshd. */
143 if (access ("/sbin/service", X_OK
) == 0
144 && access ("/usr/sbin/sshd", X_OK
) == 0
145 && access ("/bin/bash", X_OK
) == 0)
147 if (check_elf ("/usr/sbin/sshd"))
148 verbose_exec (121, "/sbin/service", "/sbin/service", "sshd", "condrestart");
154 #ifndef NO_SIZE_OPTIMIZATION
155 int __libc_multiple_threads
__attribute__((nocommon
));
156 int __libc_enable_asynccancel (void) { return 0; }
157 void __libc_disable_asynccancel (int x
) { }
158 void __libc_csu_init (void) { }
159 void __libc_csu_fini (void) { }
160 pid_t
__fork (void) { return -1; }
165 __libc_start_main (int (*main
) (void), int argc
, char **argv
,
166 void (*init
) (void), void (*fini
) (void),
167 void (*rtld_fini
) (void), void * stack_end
)
172 int (*main
) (int, char **, char **, void *);
173 int (*init
) (int, char **, char **, void *);
178 __libc_start_main (int argc
, char **ubp_av
, char **ubp_ev
,
179 void *auxvec
, void (*rtld_fini
) (void),
180 struct startup_info
*stinfo
,
181 char **stack_on_entry
)
184 #if defined __ia64__ || defined __powerpc64__
185 register void *r13
__asm ("r13") = thr_buf
+ 32768;
186 __asm ("" : : "r" (r13
));
187 #elif defined __sparc__
188 register void *g6
__asm ("g6") = thr_buf
+ 32768;
190 __thread_self
= thr_buf
+ 32768;
192 register void *__thread_self
__asm ("g7") = thr_buf
+ 32768;
194 __asm ("" : : "r" (g6
), "r" (__thread_self
));
195 #elif defined __s390__ && !defined __s390x__
196 __asm ("sar %%a0,%0" : : "d" (thr_buf
+ 32768));
197 #elif defined __s390x__
198 __asm ("sar %%a1,%0; srlg 0,%0,32; sar %%a0,0" : : "d" (thr_buf
+ 32768) : "0");
199 #elif defined __powerpc__ && !defined __powerpc64__
200 register void *r2
__asm ("r2") = thr_buf
+ 32768;
201 __asm ("" : : "r" (r2
));
209 vexec (int failcode
, char *const path
[])
212 int status
, save_errno
;
217 execv (path
[0], path
+ 1);
220 says (" exec failed with errno ");
229 says (" fork failed with errno ");
232 _exit (failcode
+ 1);
234 if (waitpid (0, &status
, 0) != pid
|| !WIFEXITED (status
))
237 says (" child terminated abnormally\n");
238 _exit (failcode
+ 2);
240 if (WEXITSTATUS (status
))
243 says (" child exited with exit code ");
244 sayn (WEXITSTATUS (status
));
246 _exit (WEXITSTATUS (status
));
251 says (const char *str
)
253 write (1, str
, strlen (str
));
259 char string
[sizeof (long) * 3 + 1];
260 char *p
= string
+ sizeof (string
) - 1;
268 *--p
= '0' + num
% 10;
276 message (char *const path
[])
278 says ("/usr/sbin/glibc_post_upgrade: While trying to execute ");
283 check_elf (const char *name
)
285 /* Play safe, if we can't open or read, assume it might be
286 ELF for the current arch. */
288 int fd
= open (name
, O_RDONLY
);
292 if (read (fd
, &ehdr
, offsetof (Elf32_Ehdr
, e_version
))
293 == offsetof (Elf32_Ehdr
, e_version
))
296 if (ehdr
.e_ident
[EI_CLASS
]
297 == (sizeof (long) == 8 ? ELFCLASS64
: ELFCLASS32
))
300 ret
= ehdr
.e_machine
== EM_386
;
301 #elif defined __x86_64__
302 ret
= ehdr
.e_machine
== EM_X86_64
;
303 #elif defined __ia64__
304 ret
= ehdr
.e_machine
== EM_IA_64
;
305 #elif defined __powerpc64__
306 ret
= ehdr
.e_machine
== EM_PPC64
;
307 #elif defined __powerpc__
308 ret
= ehdr
.e_machine
== EM_PPC
;
309 #elif defined __s390__ || defined __s390x__
310 ret
= ehdr
.e_machine
== EM_S390
;
311 #elif defined __x86_64__
312 ret
= ehdr
.e_machine
== EM_X86_64
;
313 #elif defined __sparc__
314 if (sizeof (long) == 8)
315 ret
= ehdr
.e_machine
== EM_SPARCV9
;
317 ret
= (ehdr
.e_machine
== EM_SPARC
318 || ehdr
.e_machine
== EM_SPARC32PLUS
);