_mh_execute_header is not accessible from a dylib unless libruby.dylib is
built with -undefined dynamic_lookup. And using -undefined
dynamic_lookup is not good style.
Reported by Jeremy Huddleston Sequoia <jeremyhu@apple.com>
Reviewed-by: Jeremy Huddleston Sequoia <jeremyhu@apple.com>
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@66971 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
because it was for "-assi -Wpedantic" on Travis, but we changed the
Travis build to "-std=c99 -Wpedantic".
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@66786 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
It's safer to backport r66768 to 2.6 branch, but for 2.7 it's not
needed anymore.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@66782 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
If there's no dwarf and symbol table, this will be a last resort.
(mainly on macOS)
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@65897 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Assigning uint64_t to size_t or uintptr_t caused a build error.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@65320 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
If maximum_operations_per_instruction != 1, it is VLIW.
But there seems no need to support such architecture now.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@65289 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
ICC uses DWARF4 for .debug_line which adds
maximum_operations_per_instruction in its header.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@65201 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
It seems nobody on earth is interested in such thing for it.
Ignore compiler warnings.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@65159 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Though DWARF specifies "the applicable base address defaults to the base
address of the compilation unit", but GCC seems to use zero as default.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@65103 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
../addr2line.c: In function ‘fill_lines’:
../addr2line.c:709:8: warning: ‘file’ may be used uninitialized in this function [-Wmaybe-uninitialized]
if (file != NULL) {
^
../addr2line.c:535:11: warning: ‘filesize’ may be used uninitialized in this function [-Wmaybe-uninitialized]
off_t filesize;
^~~~~~~~
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@64762 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
FreeBSD 11.0 unfortunately lacks ELF compression definitions in their
elf.h (sys/elf_common.h), and 11.1 introduced them.
b9167d33a1
Though we can add workaround, we simply drop support because
FreeBSD 11.0 is already EOL at November 30, 2017.
https://www.freebsd.org/security/unsupported.html
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@64351 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
POSIX mmap(3) manpage stipulates mmap bumps the reference
count of the file description. Thus keeping a file descriptor
to maintain the reference is not necessary.
If this didn't work, every extension .so would require a
permanent FD, which is obviously not the case.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@63908 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* addr2line.c: Because stdbool.h is a C99 feature, compile error
occurs with some old compilers without specifying C99 options.
Fix compile error with Oracle Solaris Studio 12.4 on Solaris 10.
[Bug #14200] [ruby-dev:50366]
* missing/stdbool.h: Alternative of stdbool.h for C89 compilers.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@61326 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
SHF_COMPRESSED was not defined until glibc 2.22, and there are
older distros (e.g. Debian 8.x jessie) which do not have this
defined.
Perhaps it is safe to define SHF_COMPRESSED to (1 << 11) ourselves,
too, since ELF should be a standardized format.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@60843 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
To identify the line of backtrace with ease, show the offset address of library.
You can just find the source filename and the line with
`addr2line -e libruby.so.2.5.0 0xXXXX`
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@60841 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* addr2line.c (follow_debuglink): insert global_debug_dir by using
memmove instead of copying to temporary buffer.
* dln.c (dln_load): use memcpy with the known length instead of
strcpy.
* gc.c (rb_gc_unprotect_logging): use strdup instead of malloc and
strcpy.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@57189 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
more than two decades ago. [fix GH-1350] Patch by @cremno
* include/ruby/ruby.h: ditto.
* io.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@55189 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
with dladdr_fbases introduced at r45563.
it didn't get before if the executalbe is not pie.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@45587 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
At least sh, csh, tcsh, bash, and zsh sets realpath of the main
executable for dladdr, but gdb doesn't.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@45586 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
which is retrived from dladdr to dladdr_fbases, to skip already
parsed objects.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@45563 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
symbol '_start'.
* addr2line.c (fill_lines): instead of above, get a dynamic symbol
in the main executable and use it to know the base address.
* addr2line.c (follow_debuglink0): use obj_info_t instead of
line_info_t to handle object related data.
* addr2line.c (main_exe_path): defined for Linux.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@45493 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
.symtab section exists, the section's type can be SHT_NOBITS and
actual data doesn't exist in the file. [Bug #9654]
revert r45441.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@45445 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
fc18 powerpc64's libc6-dbg has symtab/strtab but it can't be
referenced. therefore add workaround not to see them.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@45441 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
the basis of base addresses comparison.
* addr2line.c: use uintptr_t instead of intptr_t for poinrters.
* addr2line.c (rb_dump_backtrace_with_lines): don't use syms.
* vm_dump.c (rb_print_backtrace): ditto.
* addr2line.h: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@45425 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
be a function in the main executable, whose absolute path is not
available by dladdr, and ruby get it by /proc/self/exe on Linux.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@45410 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
because DWARF's line_Base is signed char and char maybe unsigned.
patched by Rei Odaira. [ruby-dev:48068] [Bug #9654]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@45391 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
address. Therefore noreturn function with tail call's return
address may be in another function.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@45346 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
symbol table if it is built with cc -g and not stripped.
Now ruby can show static symbols on Linux though glibc's
backtrace_symbols(3) don't show them.
* addr2line.c (rb_dump_backtrace_with_lines): use dladdr(3) to
detect what object file declares the symbol because
dl_iterate_phdr can't detect the main executable file
and codes on the stack.
NOTE: signal trampolines sometimes on the user stack. (FreeBSD)
* addr2line.c (rb_dump_backtrace_with_lines): stop showing
backtrace if the function's name is main.
NOTE: FreeBSD's backtrace (libexecinfo) shows _start and
an additional address. Why it doesn't remove them on dladdr phase
is, dladdr may fail to detect the main function but detect
as _start function. Therefore it must be after scanning
the symbol table and getting correct name.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@45335 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* addr2line.c (fill_lines): show the line number in C backtrace if
ruby is built without --enable-shared (PIE) on Linux.
patch is originally by Shinichiro Hamaji
https://twitter.com/shinh/status/441957774264504321
NOTE: ld doesn't insert __executable_start for PIE.
dladdr(3)'s argument must be a function pointer.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@45305 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
__inline is not available with old compilers on Solaris.
[ruby-dev:47229] [Bug #8227]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@40161 b2dd03c8-39d4-4d8f-98ff-823fe69b080e