Author: jhibbits Date: Sat Nov 1 16:27:08 2014 New Revision: 221063 URL: http://llvm.org/viewvc/llvm-project?rev=221063&view=rev Log: Use kern.proc.auxv to get the aux data
Summary: Instead of using a homegrown solution to get the auxv from a process, instead use the OS-provided sysctl to get the needed data. This allows the same code to be used for both 32-bit and 64-bit processes on a 64-bit host. Reviewers: emaste Reviewed By: emaste Subscribers: emaste, lldb-commits Differential Revision: http://reviews.llvm.org/D6071 Modified: lldb/trunk/source/Host/freebsd/Host.cpp Modified: lldb/trunk/source/Host/freebsd/Host.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/freebsd/Host.cpp?rev=221063&r1=221062&r2=221063&view=diff ============================================================================== --- lldb/trunk/source/Host/freebsd/Host.cpp (original) +++ lldb/trunk/source/Host/freebsd/Host.cpp Sat Nov 1 16:27:08 2014 @@ -286,95 +286,22 @@ Host::GetProcessInfo (lldb::pid_t pid, P return false; } -static lldb::DataBufferSP -GetAuxvData32(lldb_private::Process *process) -{ - struct { - uint32_t ps_argvstr; - int ps_nargvstr; - uint32_t ps_envstr; - int ps_nenvstr; - } ps_strings; - void *ps_strings_addr, *auxv_addr; - struct privElf32_Auxinfo { int a_type; unsigned int a_val; } aux_info32[AT_COUNT]; - struct ptrace_io_desc pid; - DataBufferSP buf_sp; - std::unique_ptr<DataBufferHeap> buf_ap(new DataBufferHeap(1024, 0)); - - // TODO:FIXME: Need a way to get this dynamically, instead of a magic - // constant that only works on a single architecture. - ps_strings_addr = (void *)0xffffdff0; - pid.piod_op = PIOD_READ_D; - pid.piod_addr = &ps_strings; - pid.piod_offs = ps_strings_addr; - pid.piod_len = sizeof(ps_strings); - if (::ptrace(PT_IO, process->GetID(), (caddr_t)&pid, 0)) { - perror("failed to fetch ps_strings"); - buf_ap.release(); - goto done; - } - - auxv_addr = (void *)(ps_strings.ps_envstr + sizeof(uint32_t) * (ps_strings.ps_nenvstr + 1)); - - pid.piod_addr = aux_info32; - pid.piod_offs = auxv_addr; - pid.piod_len = sizeof(aux_info32); - if (::ptrace(PT_IO, process->GetID(), (caddr_t)&pid, 0)) { - perror("failed to fetch aux_info"); - buf_ap.release(); - goto done; - } - memcpy(buf_ap->GetBytes(), aux_info32, pid.piod_len); - buf_sp.reset(buf_ap.release()); - - done: - return buf_sp; -} - lldb::DataBufferSP Host::GetAuxvData(lldb_private::Process *process) { - int mib[2] = { CTL_KERN, KERN_PS_STRINGS }; - void *ps_strings_addr, *auxv_addr; - size_t ps_strings_size = sizeof(void *); - Elf_Auxinfo aux_info[AT_COUNT]; - struct ps_strings ps_strings; - struct ptrace_io_desc pid; + int mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_AUXV, 0 }; + size_t auxv_size = AT_COUNT * sizeof(Elf_Auxinfo); DataBufferSP buf_sp; - if (process->GetAddressByteSize() < HostInfo::GetArchitecture().GetAddressByteSize()) - return GetAuxvData32(process); - - std::unique_ptr<DataBufferHeap> buf_ap(new DataBufferHeap(1024, 0)); - - if (::sysctl(mib, 2, &ps_strings_addr, &ps_strings_size, NULL, 0) == 0) { - pid.piod_op = PIOD_READ_D; - pid.piod_addr = &ps_strings; - pid.piod_offs = ps_strings_addr; - pid.piod_len = sizeof(ps_strings); - if (::ptrace(PT_IO, process->GetID(), (caddr_t)&pid, 0)) { - perror("failed to fetch ps_strings"); - buf_ap.release(); - goto done; - } - - auxv_addr = ps_strings.ps_envstr + ps_strings.ps_nenvstr + 1; + std::unique_ptr<DataBufferHeap> buf_ap(new DataBufferHeap(auxv_size, 0)); - pid.piod_addr = aux_info; - pid.piod_offs = auxv_addr; - pid.piod_len = sizeof(aux_info); - if (::ptrace(PT_IO, process->GetID(), (caddr_t)&pid, 0)) { - perror("failed to fetch aux_info"); - buf_ap.release(); - goto done; - } - memcpy(buf_ap->GetBytes(), aux_info, pid.piod_len); + mib[3] = process->GetID(); + if (::sysctl(mib, 4, buf_ap->GetBytes(), &auxv_size, NULL, 0) == 0) { buf_sp.reset(buf_ap.release()); } else { - perror("sysctl failed on ps_strings"); + perror("sysctl failed on auxv"); } - done: return buf_sp; } _______________________________________________ lldb-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/lldb-commits
