mirror of
https://github.com/RGBCube/serenity
synced 2025-07-27 07:07:34 +00:00
SymbolServer: Add symbolication service for out-of-process ELF parsing
This patch adds SymbolServer, a service daemon that provides symbolication of ELF binaries. It has a very simple IPC API at the moment that only turns addresses into symbol names. This can be used to implement symbolication without having to do in-process ELF parsing yourself. :^)
This commit is contained in:
parent
54d28df97d
commit
aefd206038
11 changed files with 285 additions and 0 deletions
|
@ -26,6 +26,12 @@ BootModes=graphical
|
||||||
MultiInstance=1
|
MultiInstance=1
|
||||||
AcceptSocketConnections=1
|
AcceptSocketConnections=1
|
||||||
|
|
||||||
|
[SymbolServer]
|
||||||
|
Socket=/tmp/portal/symbol
|
||||||
|
SocketPermissions=660
|
||||||
|
User=symbol
|
||||||
|
Lazy=1
|
||||||
|
|
||||||
[LookupServer]
|
[LookupServer]
|
||||||
Socket=/tmp/portal/lookup
|
Socket=/tmp/portal/lookup
|
||||||
SocketPermissions=660
|
SocketPermissions=660
|
||||||
|
|
|
@ -11,4 +11,5 @@ window:x:13:anon,notify
|
||||||
clipboard:x:14:anon,notify
|
clipboard:x:14:anon,notify
|
||||||
webcontent:x:15:anon
|
webcontent:x:15:anon
|
||||||
image:x:16:anon,webcontent
|
image:x:16:anon,webcontent
|
||||||
|
symbol:x:17:anon
|
||||||
users:x:100:anon
|
users:x:100:anon
|
||||||
|
|
|
@ -6,5 +6,6 @@ window:!:13:13:WindowServer,,,:/:/bin/false
|
||||||
clipboard:!:14:14:Clipboard,,,:/:/bin/false
|
clipboard:!:14:14:Clipboard,,,:/:/bin/false
|
||||||
webcontent:!:15:15:WebContent,,,:/:/bin/false
|
webcontent:!:15:15:WebContent,,,:/:/bin/false
|
||||||
image:!:16:16:ImageDecoder,,,:/:/bin/false
|
image:!:16:16:ImageDecoder,,,:/:/bin/false
|
||||||
|
symbol:!:17:17:SymbolServer,,,:/:/bin/false
|
||||||
anon:!:100:100:Anonymous,,,:/home/anon:/bin/sh
|
anon:!:100:100:Anonymous,,,:/home/anon:/bin/sh
|
||||||
nona:!:200:200:Nona,,,:/home/nona:/bin/sh
|
nona:!:200:200:Nona,,,:/home/nona:/bin/sh
|
||||||
|
|
|
@ -9,6 +9,7 @@ add_subdirectory(LaunchServer)
|
||||||
add_subdirectory(LookupServer)
|
add_subdirectory(LookupServer)
|
||||||
add_subdirectory(NotificationServer)
|
add_subdirectory(NotificationServer)
|
||||||
add_subdirectory(ProtocolServer)
|
add_subdirectory(ProtocolServer)
|
||||||
|
add_subdirectory(SymbolServer)
|
||||||
add_subdirectory(SystemMenu)
|
add_subdirectory(SystemMenu)
|
||||||
add_subdirectory(SystemServer)
|
add_subdirectory(SystemServer)
|
||||||
add_subdirectory(Taskbar)
|
add_subdirectory(Taskbar)
|
||||||
|
|
12
Userland/Services/SymbolServer/CMakeLists.txt
Normal file
12
Userland/Services/SymbolServer/CMakeLists.txt
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
compile_ipc(SymbolServer.ipc SymbolServerEndpoint.h)
|
||||||
|
compile_ipc(SymbolClient.ipc SymbolClientEndpoint.h)
|
||||||
|
|
||||||
|
set(SOURCES
|
||||||
|
ClientConnection.cpp
|
||||||
|
main.cpp
|
||||||
|
SymbolServerEndpoint.h
|
||||||
|
SymbolClientEndpoint.h
|
||||||
|
)
|
||||||
|
|
||||||
|
serenity_bin(SymbolServer)
|
||||||
|
target_link_libraries(SymbolServer LibIPC)
|
96
Userland/Services/SymbolServer/ClientConnection.cpp
Normal file
96
Userland/Services/SymbolServer/ClientConnection.cpp
Normal file
|
@ -0,0 +1,96 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2021, Andreas Kling <kling@serenityos.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||||
|
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||||
|
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <AK/MappedFile.h>
|
||||||
|
#include <LibELF/Image.h>
|
||||||
|
#include <SymbolServer/ClientConnection.h>
|
||||||
|
#include <SymbolServer/SymbolClientEndpoint.h>
|
||||||
|
|
||||||
|
namespace SymbolServer {
|
||||||
|
|
||||||
|
struct CachedELF {
|
||||||
|
NonnullRefPtr<MappedFile> mapped_file;
|
||||||
|
ELF::Image elf;
|
||||||
|
};
|
||||||
|
|
||||||
|
static HashMap<String, CachedELF> s_cache;
|
||||||
|
static HashMap<int, RefPtr<ClientConnection>> s_connections;
|
||||||
|
|
||||||
|
ClientConnection::ClientConnection(NonnullRefPtr<Core::LocalSocket> socket, int client_id)
|
||||||
|
: IPC::ClientConnection<SymbolClientEndpoint, SymbolServerEndpoint>(*this, move(socket), client_id)
|
||||||
|
{
|
||||||
|
s_connections.set(client_id, *this);
|
||||||
|
}
|
||||||
|
|
||||||
|
ClientConnection::~ClientConnection()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void ClientConnection::die()
|
||||||
|
{
|
||||||
|
s_connections.remove(client_id());
|
||||||
|
}
|
||||||
|
|
||||||
|
OwnPtr<Messages::SymbolServer::GreetResponse> ClientConnection::handle(const Messages::SymbolServer::Greet&)
|
||||||
|
{
|
||||||
|
return make<Messages::SymbolServer::GreetResponse>();
|
||||||
|
}
|
||||||
|
|
||||||
|
OwnPtr<Messages::SymbolServer::SymbolicateResponse> ClientConnection::handle(const Messages::SymbolServer::Symbolicate& message)
|
||||||
|
{
|
||||||
|
auto path = message.path();
|
||||||
|
if (!s_cache.contains(path)) {
|
||||||
|
auto mapped_file = MappedFile::map(path);
|
||||||
|
if (mapped_file.is_error()) {
|
||||||
|
dbgln("Failed to map {}: {}", path, mapped_file.error().string());
|
||||||
|
return make<Messages::SymbolServer::SymbolicateResponse>(false, Vector<String> {});
|
||||||
|
}
|
||||||
|
auto elf = ELF::Image(mapped_file.value()->bytes());
|
||||||
|
if (!elf.is_valid()) {
|
||||||
|
dbgln("ELF not valid: {}", path);
|
||||||
|
return make<Messages::SymbolServer::SymbolicateResponse>(false, Vector<String> {});
|
||||||
|
}
|
||||||
|
auto cached_elf = CachedELF { mapped_file.release_value(), move(elf) };
|
||||||
|
s_cache.set(path, move(cached_elf));
|
||||||
|
}
|
||||||
|
|
||||||
|
auto it = s_cache.find(path);
|
||||||
|
ASSERT(it != s_cache.end());
|
||||||
|
auto& cached_elf = it->value;
|
||||||
|
|
||||||
|
Vector<String> symbols;
|
||||||
|
symbols.ensure_capacity(message.addresses().size());
|
||||||
|
|
||||||
|
for (auto address : message.addresses()) {
|
||||||
|
u32 offset = 0;
|
||||||
|
auto symbol = cached_elf.elf.symbolicate(address, &offset);
|
||||||
|
symbols.append(move(symbol));
|
||||||
|
}
|
||||||
|
|
||||||
|
return make<Messages::SymbolServer::SymbolicateResponse>(true, move(symbols));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
54
Userland/Services/SymbolServer/ClientConnection.h
Normal file
54
Userland/Services/SymbolServer/ClientConnection.h
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2020, Andreas Kling <kling@serenityos.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||||
|
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||||
|
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <AK/HashMap.h>
|
||||||
|
#include <LibIPC/ClientConnection.h>
|
||||||
|
#include <LibWeb/Forward.h>
|
||||||
|
#include <SymbolServer/Forward.h>
|
||||||
|
#include <SymbolServer/SymbolClientEndpoint.h>
|
||||||
|
#include <SymbolServer/SymbolServerEndpoint.h>
|
||||||
|
|
||||||
|
namespace SymbolServer {
|
||||||
|
|
||||||
|
class ClientConnection final
|
||||||
|
: public IPC::ClientConnection<SymbolClientEndpoint, SymbolServerEndpoint>
|
||||||
|
, public SymbolServerEndpoint {
|
||||||
|
C_OBJECT(ClientConnection);
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit ClientConnection(NonnullRefPtr<Core::LocalSocket>, int client_id);
|
||||||
|
~ClientConnection() override;
|
||||||
|
|
||||||
|
virtual void die() override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
virtual OwnPtr<Messages::SymbolServer::GreetResponse> handle(const Messages::SymbolServer::Greet&) override;
|
||||||
|
virtual OwnPtr<Messages::SymbolServer::SymbolicateResponse> handle(const Messages::SymbolServer::Symbolicate&) override;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
33
Userland/Services/SymbolServer/Forward.h
Normal file
33
Userland/Services/SymbolServer/Forward.h
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2021, Andreas Kling <kling@serenityos.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||||
|
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||||
|
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
namespace SymbolServer {
|
||||||
|
|
||||||
|
class ClientConnection;
|
||||||
|
|
||||||
|
}
|
4
Userland/Services/SymbolServer/SymbolClient.ipc
Normal file
4
Userland/Services/SymbolServer/SymbolClient.ipc
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
endpoint SymbolClient = 4541511
|
||||||
|
{
|
||||||
|
Dummy() =|
|
||||||
|
}
|
6
Userland/Services/SymbolServer/SymbolServer.ipc
Normal file
6
Userland/Services/SymbolServer/SymbolServer.ipc
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
endpoint SymbolServer = 4541510
|
||||||
|
{
|
||||||
|
Greet() => ()
|
||||||
|
|
||||||
|
Symbolicate(String path, Vector<u32> addresses) => (bool success, Vector<String> symbols)
|
||||||
|
}
|
71
Userland/Services/SymbolServer/main.cpp
Normal file
71
Userland/Services/SymbolServer/main.cpp
Normal file
|
@ -0,0 +1,71 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2021, Andreas Kling <kling@serenityos.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||||
|
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||||
|
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <LibCore/EventLoop.h>
|
||||||
|
#include <LibCore/LocalServer.h>
|
||||||
|
#include <LibIPC/ClientConnection.h>
|
||||||
|
#include <SymbolServer/ClientConnection.h>
|
||||||
|
|
||||||
|
int main(int, char**)
|
||||||
|
{
|
||||||
|
Core::EventLoop event_loop;
|
||||||
|
auto server = Core::LocalServer::construct();
|
||||||
|
|
||||||
|
if (pledge("stdio rpath accept", nullptr) < 0) {
|
||||||
|
perror("pledge");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (unveil("/bin", "r") < 0) {
|
||||||
|
perror("unveil");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (unveil("/usr/lib", "r") < 0) {
|
||||||
|
perror("unveil");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (unveil(nullptr, nullptr) < 0) {
|
||||||
|
perror("unveil");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ok = server->take_over_from_system_server();
|
||||||
|
ASSERT(ok);
|
||||||
|
server->on_ready_to_accept = [&] {
|
||||||
|
auto client_socket = server->accept();
|
||||||
|
if (!client_socket) {
|
||||||
|
dbgln("LaunchServer: accept failed.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
static int s_next_client_id = 0;
|
||||||
|
int client_id = ++s_next_client_id;
|
||||||
|
IPC::new_client_connection<SymbolServer::ClientConnection>(client_socket.release_nonnull(), client_id);
|
||||||
|
};
|
||||||
|
|
||||||
|
return event_loop.exec();
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue