15f9996aaSopenharmony_ci#!/usr/bin/env python 25f9996aaSopenharmony_ci# -*- coding: utf-8 -*- 35f9996aaSopenharmony_ci# Copyright (c) 2024 Huawei Device Co., Ltd. 45f9996aaSopenharmony_ci# Licensed under the Apache License, Version 2.0 (the "License"); 55f9996aaSopenharmony_ci# you may not use this file except in compliance with the License. 65f9996aaSopenharmony_ci# You may obtain a copy of the License at 75f9996aaSopenharmony_ci# 85f9996aaSopenharmony_ci# http://www.apache.org/licenses/LICENSE-2.0 95f9996aaSopenharmony_ci# 105f9996aaSopenharmony_ci# Unless required by applicable law or agreed to in writing, software 115f9996aaSopenharmony_ci# distributed under the License is distributed on an "AS IS" BASIS, 125f9996aaSopenharmony_ci# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135f9996aaSopenharmony_ci# See the License for the specific language governing permissions and 145f9996aaSopenharmony_ci# limitations under the License. 155f9996aaSopenharmony_ci 165f9996aaSopenharmony_ci 175f9996aaSopenharmony_ciimport json 185f9996aaSopenharmony_ciimport subprocess 195f9996aaSopenharmony_ciimport sys 205f9996aaSopenharmony_ci 215f9996aaSopenharmony_ci 225f9996aaSopenharmony_cidef check_json_value(json_data): 235f9996aaSopenharmony_ci for key, value in json_data.items(): 245f9996aaSopenharmony_ci if not isinstance(value, (bool, str, list)): 255f9996aaSopenharmony_ci return False 265f9996aaSopenharmony_ci if isinstance(value, list): 275f9996aaSopenharmony_ci if not all(isinstance(item, str) for item in value): 285f9996aaSopenharmony_ci return False 295f9996aaSopenharmony_ci return True 305f9996aaSopenharmony_ci 315f9996aaSopenharmony_ci 325f9996aaSopenharmony_cidef check_json_content(json_data): 335f9996aaSopenharmony_ci if len(json_data) == 1 and "kernelpermission" in json_data: 345f9996aaSopenharmony_ci json_data = json_data["kernelpermission"] 355f9996aaSopenharmony_ci return check_json_value(json_data) 365f9996aaSopenharmony_ci else: 375f9996aaSopenharmony_ci return False 385f9996aaSopenharmony_ci 395f9996aaSopenharmony_ci 405f9996aaSopenharmony_cidef check_json_file(file_path): 415f9996aaSopenharmony_ci try: 425f9996aaSopenharmony_ci with open(file_path, 'r') as file: 435f9996aaSopenharmony_ci json_data = json.load(file) 445f9996aaSopenharmony_ci if check_json_content(json_data): 455f9996aaSopenharmony_ci return True 465f9996aaSopenharmony_ci else: 475f9996aaSopenharmony_ci print("kernel_permission.json is invalid") 485f9996aaSopenharmony_ci return False 495f9996aaSopenharmony_ci except FileNotFoundError: 505f9996aaSopenharmony_ci print("kernel_permission.json not found") 515f9996aaSopenharmony_ci return False 525f9996aaSopenharmony_ci except json.JSONDecodeError: 535f9996aaSopenharmony_ci print("kernel_permission.json doesn't conform to json specification") 545f9996aaSopenharmony_ci return False 555f9996aaSopenharmony_ci except Exception: 565f9996aaSopenharmony_ci print("kernel_permission.json not found") 575f9996aaSopenharmony_ci return False 585f9996aaSopenharmony_ci 595f9996aaSopenharmony_ciif __name__ == '__main__': 605f9996aaSopenharmony_ci if len(sys.argv) != 2: 615f9996aaSopenharmony_ci print("Usage: python script.py /path/to/library.so") 625f9996aaSopenharmony_ci sys.exit(1) 635f9996aaSopenharmony_ci 645f9996aaSopenharmony_ci so_path = sys.argv[1] 655f9996aaSopenharmony_ci 665f9996aaSopenharmony_ci if (check_json_file("kernel_permission.json")): 675f9996aaSopenharmony_ci command = ['llvm-objcopy', '--add-section', '.kernelpermission=kernel_permission.json', so_path] 685f9996aaSopenharmony_ci result = subprocess.run(command, capture_output=True, text=True) 695f9996aaSopenharmony_ci 705f9996aaSopenharmony_ci if result.returncode == 0: 715f9996aaSopenharmony_ci print("llvm-objcopy executed successfully") 725f9996aaSopenharmony_ci else: 735f9996aaSopenharmony_ci print("llvm-objcopy failed") 745f9996aaSopenharmony_ci print("Error:", result.stderr) 75